2016-09-13 3 views
0

Я уверен, что это было задано раньше, но я не смог его найти. Я хочу добавить Серию в качестве нового столбца в DataFrame. Все имена индекса Series содержатся в одном столбце DataFrame, но Dataframe имеет больше строк, чем Series.Pandas: Добавить серию в DataFrame, упорядоченную по столбцу

DataFrame: 
0 London 231 
1 Beijing 328 
12 New York 920 
3 Singapore 1003 

Series: 
London AB 
New York AC 
Singapore B 

и результат должен выглядеть

0 London 231 AB 
1 Beijing 328 NaN 
12 New York 920 AC 
3 Singapore 1003 B 

Как я могу сделать это без петель? Благодаря!

+0

Вы ищете слияния: df.merge (pd.DataFrame («название серии»), на = «город», как = «левый») –

+0

Каковы имена столбцов в вашем DataFrame? –

ответ

0

Вы можете использовать pandas.DataFrame.merge()

df = pd.DataFrame({'A': [0,1,12,3], 'B': ['London', 'Beijing', 'New York', 'Singapore'], 'C': [231, 328, 920, 1003] }) 
    A   B  C 
0 0  London 231 
1 1 Beijing 328 
2 12 New York 920 
3 3 Singapore 1003 

s = pd.Series(['AB', 'AC', 'B'], index=['London', 'New York', 'Singapore']) 
London  AB 
New York  AC 
Singapore  B 
dtype: object 

df2 = pd.DataFrame({'D': s.index, 'E': s.values }) 
      D E 
0  London AB 
1 New York AC 
2 Singapore B 

Затем, вы можете объединить кадры два данных:

merged = df.merge(df2, how='left', left_on='B', right_on='D') 
    A   B  C   D E 
0 0  London 231  London AB 
1 1 Beijing 328  NaN NaN 
2 12 New York 920 New York AC 
3 3 Singapore 1003 Singapore B 

Вы можете удалить столбцы D

merged = merged.drop('D', axis=1) 
    A   B  C E 
0 0  London 231 AB 
1 1 Beijing 328 NaN 
2 12 New York 920 AC 
3 3 Singapore 1003 B 
0
  1. набор index для названий городов как для df и series
  2. объединить с помощью панд merge

import pandas as pd 

cities = ['London', 'Beijing', 'New York', 'Singapore'] 

df_data = { 
    'col_1': [0,1,12,3], 
    'col_2': [231, 328, 920, 1003], 
} 

df = pd.DataFrame(df_data, index=cities) 

cities2 = ['London','New York','Singapore'] 

series = pd.Series(['AB', 'AC', 'B'], index=cities2) 


combined = pd.merge(
    left=df, 
    right=pd.DataFrame(series), 
    how='left', 
    left_index=True, 
    right_index=True 
) 

print combined 

ВЫВОД:

  col_1 col_2 0 
London   0 231 AB 
Beijing  1 328 NaN 
New York  12 920 AC 
Singapore  3 1003 B 
0

на основе решения @Joe R с некоторыми modificaiton. скажем, ДФ ваш DataFrame и s ваша серия

s = s.to_frame().reset_index() 
df = df.merge(s,how='left',left_on=df['B'],right_on=s['index']).ix[:,[0,1,3]] 
Смежные вопросы