分析数据帧上的所有行和列

  • 本文关键字:数据帧 python dataframe
  • 更新时间 :
  • 英文 :


那里!我有一个具有502489行×103列的df。

每一行对应一个参与者,每一列对应不同时间的值。我想创建一个函数,它可以查看行和列,并随时(在任何列中)选择具有特定值(==1135)的参与者(行)。我尝试了loc和set,但它不起作用,因为它需要指定列名称,但以这种方式是不可行的,因为我有103列,我想查找其中的任何一列。有什么建议吗?

在此处输入图像描述

这里不是完美但有效的解决方案:

list = [['col0','col1','col2','col3','col4'],
['valjk','valj','valjo','valhl','valjk'],
['valnjk','bkl','ijl','bkbk','vall;'],
['mkl','search1','ml;','mkl','bhj'],
['bjk','bkj','hvbj','lkl','hkl'],
['vhj','vhj','nl','gh','cty'],
['vjbh','uik','bjj','vuhjb','bnl'],
['vbhj','bknk','jk','seach2','vbhkjn'],
['vbhj','bjn','ml;','njm ','rf'],
['vbhj','bjn','ml;','njm ','rf'],
['vbjkhj','bknk','jk','hjhk','search1'],
['vbhj','bjn','search1','njm ','rf'],
['vbhj','bjn','ml;','njm ','rf'],
['fty','search1','rtyj','dfgh','yy']
]
df = pd.DataFrame(list[1:],columns=list[0])
selected= []
frames = []
for d in df.columns:
selected.append(df.loc[df[d] == 'search1'])
for k in range(len(selected)):
if(not selected[k].empty):
frames.append(selected[k])
result = pd.concat(frames)  
print(result)

结果是:

col0     col1     col2  col3     col4
mkl  search1      ml;   mkl      bhj
fty  search1     rtyj  dfgh       yy
vbhj      bjn  search1  njm        rf
vbjkhj     bknk       jk  hjhk  search1

您可以对df.itertuples进行迭代,以获取数据帧的参与者,并使用它为每个参与者构造一个值的bool列表。然后,您可以使用df.loc来获取布尔列表中有True值的行:

bool_list = []
for participant in df.itertuples(name=None):
bool_list.append(1135 in participant)
print(df.loc(bool_list))

使用可以简化为单行代码的理解:

print(df.loc[(1135 in participant for participant in df.itertuples(name=None))])

另一种没有df.itertuples的方法(我认为这被认为是的坏做法)是将df.applyaxis=1一起使用以获得布尔列表:

print(df.loc[df.apply(lambda row: 1135 in row, axis=1, raw=True)]

时间比较:

>>> timeit('df.loc[(1135 in row for row in df.itertuples(name=None))]', globals={'df': df}, number=5000)
3.968556400000125
>>> timeit('df.loc[df.apply(lambda row: 1135 in row, axis=1, raw=True)]', globals={'df': df}, number=5000)
4.834247799999957

与我读过的所有内容(令人钦佩的是,内容不多)相反,第一种方法更快。

最新更新