微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

我有一个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)

结果如下:

            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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐