根据每行中的值获取列标题

Mat*_*ker 5 python pandas

我有一个 pandas 数据框,如下所示(只是一个说明):

import datetime
todays_date = datetime.datetime.now().date()   
index = pd.date_range(todays_date-datetime.timedelta(10), periods=2, freq='D')
columnheader=['US', 'Canada', 'UK', 'Japan']
data=np.array([[3,4,2,1],[1,4,3,2]])
df = pd.DataFrame(data, index=index, columns=columnheader)
Run Code Online (Sandbox Code Playgroud)

结果是:

            US  Canada  UK  Japan
2015-07-26   3       4   2      1
2015-07-27   1       4   3      2
Run Code Online (Sandbox Code Playgroud)

我需要找到每行的值为 1 和 2 的列标题。

所以我应该得到

['Japan', 'UK']
['US', 'Japan']
Run Code Online (Sandbox Code Playgroud)

EdC*_*ica 3

您可以执行以下操作,这会测试每一行的 using 成员资格1,2isin如果是这样,这会生成一个布尔系列,您可以通过再次调用使用它来索引列apply,我们将其转换为列表,因为维度不会对齐,如果你不这样做:

\n\n
In [191]:\ndf.apply(lambda x: x.isin([1,2]), axis=1).apply(lambda x: list(df.columns[x]), axis=1)\n\nOut[191]:\n2015-07-26    [UK, Japan]\n2015-07-27    [US, Japan]\nFreq: D, dtype: object\n
Run Code Online (Sandbox Code Playgroud)\n\n

内部输出apply

\n\n
In [192]:\ndf.apply(lambda x: x.isin([1,2]), axis=1)\n\nOut[192]:\n               US Canada     UK Japan\n2015-07-26  False  False   True  True\n2015-07-27   True  False  False  True\n
Run Code Online (Sandbox Code Playgroud)\n\n

编辑

\n\n

如果你想保持顺序,那么你可以定义一个函数来测试每个值并将其作为一系列返回:

\n\n
In [209]:\nfilter_vals=[1,2]\ndef func(x):\n    l=[]\n    for val in filter_vals:\n        for col in df:\n            if x[col] == val:\n                l.append(col)\n\xe2\x80\x8b\n    return pd.Series(l)\ndf.apply(func, axis=1)\n\nOut[209]:\n                0      1\n2015-07-26  Japan     UK\n2015-07-27     US  Japan\n
Run Code Online (Sandbox Code Playgroud)\n