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

标签 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)

结果是:

            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,如果是,则会生成一个 bool 系列,您可以使用它来索引通过再次调用 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

内部 apply 的输出:

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

编辑

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

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

关于python - 根据每行中的值获取列标题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31834888/

相关文章:

python - 使用pandas在同一索引的列中查找连续天数的开始和结束日期

python - 将特定单词后的单词提取为列表

python - 循环两个单独的数据帧,Haversine 函数,存储值

python - 在 Python 中将小时和分钟转换为总分钟

python - Pandas 数据框根据条件卡住

python - groupby 的条件均值

python - Numpy 添加给定行

python - 如何在python中指定某个轴的外积?

Python用json传输代码

python - 在python中对数组列表进行分类