Python 基于每行中的值获取列标题
我有一个熊猫数据框,如下所示(只是一个示例): 其结果是:Python 基于每行中的值获取列标题,python,pandas,Python,Pandas,我有一个熊猫数据框,如下所示(只是一个示例): 其结果是: US Canada UK Japan 2015-07-26 3 4 2 1 2015-07-27 1 4 3 2 我需要找到每行值分别为1和2的列标题 所以我应该 ['Japan', 'UK'] ['US', 'Japan'] 您可以执行以下操作,这将使用isin测试每一行的1,2成员资格,如果是这样,这将生成一个布尔序列,您可以再次调用app
US Canada UK Japan
2015-07-26 3 4 2 1
2015-07-27 1 4 3 2
我需要找到每行值分别为1和2的列标题
所以我应该
['Japan', 'UK']
['US', 'Japan']
您可以执行以下操作,这将使用
isin
测试每一行的1,2
成员资格,如果是这样,这将生成一个布尔序列,您可以再次调用apply
将其索引到列中,我们将其转换为列表,因为如果不这样做,维度将不会对齐:
In [191]:
df.apply(lambda x: x.isin([1,2]), axis=1).apply(lambda x: list(df.columns[x]), axis=1)
Out[191]:
2015-07-26 [UK, Japan]
2015-07-27 [US, Japan]
Freq: D, dtype: object
内部应用的输出
:
In [192]:
df.apply(lambda x: x.isin([1,2]), axis=1)
Out[192]:
US Canada UK Japan
2015-07-26 False False True True
2015-07-27 True False False True
编辑
如果要保持顺序,则可以定义一个func来测试每个值,并将其作为一个系列返回:
In [209]:
filter_vals=[1,2]
def func(x):
l=[]
for val in filter_vals:
for col in df:
if x[col] == val:
l.append(col)
return pd.Series(l)
df.apply(func, axis=1)
Out[209]:
0 1
2015-07-26 Japan UK
2015-07-27 US Japan
谢谢EdChum!这正是我想要的。
In [209]:
filter_vals=[1,2]
def func(x):
l=[]
for val in filter_vals:
for col in df:
if x[col] == val:
l.append(col)
return pd.Series(l)
df.apply(func, axis=1)
Out[209]:
0 1
2015-07-26 Japan UK
2015-07-27 US Japan