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