2016-10-07 3 views
1

Это, наверное, глупый вопрос, но я пытался какое-то время, и я не могу заставить его работать.Pandas Apply возвращает матрицу вместо одного столбца

У меня есть dataframe:

df1 = pd.DataFrame({'Type': ['A','A', 'B', 'F', 'C', 'G', 'A', 'E'], 'Other': [999., 999., 999., 999., 999., 999., 999., 999.]}) 

теперь я хочу, чтобы создать новый столбец, основанный на колонке Type. Для этого у меня есть второй фрейм данных:

df2 = pd.DataFrame({'Type':['A','B','C','D','E','F', 'G'],'Value':[1, 1, 2, 3, 4, 4, 5]}) 

, который я использую в качестве справочной таблицы.

Когда я пытаюсь что-то вроде:

df1.apply(lambda x: df2.Value[df2.Type == x['Type']],axis=1) 

Я получаю матрицу вместо одного столбца:

Out[21]: 
     0 1 2 4 5 6 
    0 1 NaN NaN NaN NaN NaN 
    1 1 NaN NaN NaN NaN NaN 
    2 NaN 1 NaN NaN NaN NaN 
    3 NaN NaN NaN NaN 4 NaN 
    4 NaN NaN 2 NaN NaN NaN 
    5 NaN NaN NaN NaN NaN 5 
    6 1 NaN NaN NaN NaN NaN 
    7 NaN NaN NaN 4 NaN NaN 

То, что я хочу, однако, заключается в следующем:

 0 
    0 1 
    1 1 
    2 1 
    3 4 
    4 2 
    5 5 
    6 1 
    7 4 

Что утра Я делаю неправильно?

ответ

1

Вы можете использовать map для достижения этого:

In [62]: 
df1['Type'].map(df2.set_index('Type')['Value'],na_action='ignore') 

Out[62]: 
0 1 
1 1 
2 1 
3 4 
4 2 
5 5 
6 1 
7 4 
Name: Type, dtype: int64 

Если вы изменили вашу apply попытку следующие тогда работало бы:

In [70]: 
df1['Type'].apply(lambda x: df2.loc[df2.Type == x,'Value'].values[0]) 

Out[70]: 
0 1 
1 1 
2 1 
3 4 
4 2 
5 5 
6 1 
7 4 
Name: Type, dtype: int64 

Если мы посмотрим на то, что вы пробовали:

df1.apply(lambda x: df2.Value[df2.Type == x['Type']],axis=1) 

это пытается сравнить «тип» и верните значение «значение», здесь проблема заключается в том, что вы возвращаете серию с индексом df2, это путает панды и вызывает возврат матрицы. Вы можете увидеть это, если мы с жестким кодом «B» в качестве примера:

In [75]: 
df2.Value[df2.Type == 'B'] 

Out[75]: 
1 1 
Name: Value, dtype: int64 
+0

Отлично, спасибо большое! – petetheat

+0

Сделано! еще раз спасибо – petetheat

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