Допустим, у меня есть очень простой pandas dataframe, содержащий один индексированный столбец с «начальными значениями».Я хочу прочитать в цикле N других фреймов данных, чтобы заполнить один столбец «сравнения» с соответствующими индексами.
Например, с моим исходным фреймом данных как
Initial
0 a
1 b
2 c
3 d
и следующими двумякадры для чтения в цикле
Comparison
0 e
1 f
Comparison
2 g
3 h
4 i <= note that this index doesn't exist in Initial so won't be matched
Я хотел бы получить следующий результат
Initial Comparison
0 a e
1 b f
2 c g
3 d h
Используя merge
, concat
или join
, мне кажется,быть в состоянии создать новый столбец для каждой итерации цикла, заполняя пробелы NaN
.
Какой самый панда-питонический способ достижения этого?
Нижепример из предложенного дублирующего решения:
import pandas as pd
import numpy as np
df1 = pd.DataFrame(np.array([['a'],['b'],['c'],['d']]), columns=['Initial'])
print df1
df2 = pd.DataFrame(np.array([['e'],['f']]), columns=['Compare'])
print df2
df3 = pd.DataFrame(np.array([[2,'g'],[3,'h'],[4,'i']]), columns=['','Compare'])
df3 = df3.set_index('')
print df3
print df1.merge(df2,left_index=True,right_index=True).merge(df3,left_index=True,right_index=True)
>>
Initial
0 a
1 b
2 c
3 d
Compare
0 e
1 f
Compare
2 g
3 h
4 i
Empty DataFrame
Columns: [Initial, Compare_x, Compare_y]
Index: []
Второе редактирование: @WB, похоже, работает следующее, но это не может быть так, что нетболее простой вариант с использованием правильных методов панд.Также необходимо отключить предупреждения, которые могут быть опасными ...
pd.options.mode.chained_assignment = None
df1["Compare"]=pd.Series()
for ind in df1.index.values:
if ind in df2.index.values:
df1["Compare"][ind]=df2.T[ind]["Compare"]
if ind in df3.index.values:
df1["Compare"][ind]=df3.T[ind]["Compare"]
print df1
>>
Initial Compare
0 a e
1 b f
2 c g
3 d h