[英]Get column header based on a value in each row
我有一個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
內部輸出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
編輯
如果您想維護訂單,那么您可以定義一個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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.