2014-01-28 2 views
2

Рассмотрим тривиальный пример с Dataframe df и серии sНевозможно присвоить значение для столбца в панд DataFrame с использованием значения другого столбца в серии ключ

import pandas as pd 

matching_vals = range(20,30) 

df = pd.DataFrame(columns=['a'], index=range(0,10)) 
df['a'] = matching_vals 
s = pd.Series(list("ABCDEFGHIJ"), index=matching_vals) 

df['b'] = s[df['a']] 

На данный момент я бы ожидать df['b'] содержать буквы A через J, но вместо этого все это NaN. Однако, если я заменю последнюю строку с

n = df['a'][2] 
df['c'] = s[n] 

затем df['c'] заполнен C с, как я бы ожидать, так что я уверен, что это не какая-то странная ошибка типа.

Я новичок в пандах, и это сводит меня с ума.

ответ

3

s[df['a']] имеет индекс, который отличается от индекса df «s:

In [104]: s[df['a']] 
Out[104]: 
a 
20 A 
21 B 
22 C 
23 D 
24 E 
25 F 
26 G 
27 H 
28 I 
29 J 

При назначении серии на колонке с DataFrame, панды пытается присвоить значения в соответствии с индексом. Поскольку s[df['a']] не имеет значений, связанных с индексами значений df, NaN. Назначение не добавляет новые строки в df.

Если вы не хотите, чтобы индекс, чтобы войти в задание, вы можете использовать

df['b'] = s[df['a']].values 

Для демонстрации соответствия показателей, обратите внимание, как

import pandas as pd 

df = pd.DataFrame(columns=['a'], index=range(0,10)) 
df['a'] = range(0,10)[::-1] 
s = pd.Series(list("ABCDEFGHIJ"), index=range(0,10)[::-1]) 
df['b'] = s[df['a']] 

урожаи

In [123]: s[df['a']] 
Out[123]: 
a 
9 A 
8 B 
7 C 
6 D 
5 E 
4 F 
3 G 
2 H 
1 I 
0 J 
dtype: object 

In [124]: df 
Out[124]: 
    a b 
0 9 J 
1 8 I 
2 7 H 
3 6 G 
4 5 F 
5 4 E 
6 3 D 
7 2 C 
8 1 B 
9 0 A 

[10 rows x 2 columns] 

T значения df['b'] «перевернуты», чтобы совпадение индексов.

+0

Удивительно, спасибо! –

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