加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

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

发布时间:2020-12-20 13:51:47 所属栏目:Python 来源:网络整理
导读:我有一个pandas数据帧,如下所示(只是一个插图): import datetimetodays_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([[
我有一个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,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,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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读