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