我有一个 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)
您可以执行以下操作,这会测试每一行的 using 成员资格1,2,isin如果是这样,这会生成一个布尔系列,您可以通过再次调用使用它来索引列apply,我们将其转换为列表,因为维度不会对齐,如果你不这样做:
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\nRun Code Online (Sandbox Code Playgroud)\n\n内部输出apply:
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\nRun Code Online (Sandbox Code Playgroud)\n\n编辑
\n\n如果你想保持顺序,那么你可以定义一个函数来测试每个值并将其作为一系列返回:
\n\nIn [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\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
2453 次 |
| 最近记录: |