2017-01-06 5 views
1

У меня есть panadas datsfram (df) как ['key', 'col1', 'col2', 'col3'], и у меня есть серия pandas (sr), для которой индекс является такой же, как «ключ» в кадре данных. Я хочу добавить серию в dataframe в новый столбец с именем col4 с тем же «ключом». У меня есть следующий код:Добавлять серии Pandas в DataFram как столбец

for index, row in segmention.iterrows():  
    df[df['key']==row['key']]['col4']=sr.loc[row['key']] 

Код очень медленный. Я предполагаю, что должен быть более эффективный и лучший способ сделать это. не могли бы вы помочь?

+0

IIUC затем 'Df [«COL4»] = D [«ключ»]. Карта (ср)' должна работать – EdChum

+1

Было бы полезно вы опубликуете типичный пример и желаемый результат, чтобы избежать двусмысленности – EdChum

ответ

0

Использование map как упомянуто EdChum:

df['col4'] = df['key'].map(sr) 
print (df) 
    col1 col2 col3 key col4 
0  4  7  1 A  2 
1  5  8  3 B  4 
2  6  9  5 C  1 

Или назначить с set_index:

df = df.set_index('key') 
df['col4'] = sr 
print (df) 
    col1 col2 col3 col4 
key       
A  4  7  1  2 
B  5  8  3  4 
C  6  9  5  1 

Если не нужны align данные в Series по key использования (см разница 2,1,4 против 4,1,2):

df['col4'] = sr.values 
print (df) 
    col1 col2 col3 key col4 
0  4  7  1 A  4 
1  5  8  3 B  1 
2  6  9  5 C  2 

Пример:

df = pd.DataFrame({'key':[1,2,3], 
        'col1':[4,5,6], 
        'col2':[7,8,9], 
        'col3':[1,3,5]}, index=list('ABC')) 

print (df) 
    col1 col2 col3 key 
A  4  7  1 1 
B  5  8  3 2 
C  6  9  5 3 

sr = pd.Series([4,1,2], index=list('BCA')) 
print (sr) 
B 4 
C 1 
A 2 
dtype: int64 

df['col4'] = df['key'].map(sr) 
print (df) 
    col1 col2 col3 key col4 
0  4  7  1 A  2 
1  5  8  3 B  4 
2  6  9  5 C  1 

df = df.set_index('key') 
df['col4'] = sr 
print (df) 
    col1 col2 col3 col4 
key       
A  4  7  1  2 
B  5  8  3  4 
C  6  9  5  1 
+0

Я думаю, что OP хочет добавить новый столбец «col4», как «карта» или «слияние» на основе 'key' – EdChum

0

Вы можете просто сделать:

df['col4'] = sr 

Если не понимают.

0

Это действительно хороший вариант использования для join, где левая рамка данных выравнивает столбец с индексом нужного кадра данных/серии. Вы должны убедиться, что ваша серия имеет имя для его работы

sr.name = 'some name' 
df.join(sr, on='key')