2015-08-05 5 views
3

У меня есть панд dataframe, что-то вроде ниже (просто иллюстрация):Получить заголовок столбца на основе значения в каждой строке

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'] 

ответ

1

Вы можете сделать следующее, это проверяет каждую строку на членство 1,2 с помощью isin и если так это порождает булеву серии, вы можете использовать это, чтобы индекс в столбцах по вызывая 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 

EDIT

Если вы хотите, чтобы поддерживать порядок, то вы можете определить 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 
+0

Спасибо EdChum! Это именно то, что я искал. – MathTinker

Смежные вопросы