Python 如何检查数据帧并返回包含特定字符串的列?

Python 如何检查数据帧并返回包含特定字符串的列?,python,pandas,dataframe,Python,Pandas,Dataframe,我有以下df: 0 1 2 3 4 3 Services rendered 2000 HK$’000 HK$’000 5 Audit and audit related services 999 1,800 9,999 8 fina

我有以下
df

                                  0      1      2           3          4
3                 Services rendered            2000        HK$’000 HK$’000
5  Audit and audit related services            999           1,800   9,999
8              financial statements  HK$’000   788           600     1,233,456
我想捕获同时包含货币和财务编号的列,例如
HK$'000
1800
600

  • 在这种情况下,
    df[3]
    df[4]
    是感兴趣的列,不是
    df[1]
    df[2]
所需的结果是返回一个数据帧:
df[[3,4]]
,如下所示

    3          4
3  HK$’000 HK$’000
5  1,800   9,999
8  600     1,233,456
我试过了

df_fin=df[df.apply(lambda x:x.str.contains('HK'))| df.apply(lambda x:x.str.contains('\d,?\d*))]
df_fin.iloc[:,df_fin.any().to_list()]
但它也捕获了
df[1]
df[2]
。我怎样才能得到想要的结果


谢谢。

单向使用
pandas.DataFrame。将
替换为
pandas.Series.str.isnumeric

d = {"HK\$’": "1", ",": ""}
df = df.astype(str)
cols = []
for c in df:
    if df[c].str.contains("HK\$’").any():
        if df[c].replace(d, regex=True).str.isnumeric().all():
            cols.append(c)
print(df[cols])
输出:

         3          4
3  HK$’000    HK$’000
5    1,800      9,999
8      600  1,233,456

我们可以把它分解成几个步骤,让它更容易完成。这里的假设是,整个数据帧只是字符串:

创建正则表达式:

regex1 = "HK\$’\d+$"
regex2 = "^\d+[\d,]+$"
第一个正则表达式的筛选器:

df = df.loc[:, df.apply(lambda x: x.str.contains(regex1)).any()]
df

    1       3         4
3   None    HK$’000 HK$’000
5   None    1,800   9,999
8   HK$’000 600     1,233,456
现在,筛选第二个正则表达式:

df = df.loc[:, df.apply(lambda x: x.str.contains(regex2)).any()]
df


     3        4
3   HK$’000 HK$’000
5   1,800   9,999
8   600     1,233,456

如果有一列仅为数字而没有货币,会发生什么情况。。?我需要他们两个在同一个专栏里解释更多?我看不出
astype(str)
的基本原理,因为数据帧中的每个元素都是
str
@chris\u 2020更新的。请让我知道它是否产生预期输出;)在第二个
if
子句中,如果我使用
df[c].str.contains(“\d\d*”).any()
,它是否相同?这听起来更像蟒蛇,如果是的话,我认为
d
也是没有必要的。如果你想提前获得一个特定的列,为什么不干脆这样做呢。
df=df[[3,4]]
@r-初学者,因为感兴趣的名称中的列不能保证。在实际任务中,您不知道这些列将位于何处,但您知道它们遵循一种模式。i、 e.它首先带有货币,其余行带有财务编号。