2016-04-01 4 views
0

У меня есть существующий dataframe и я пытаюсь объединить словарь, где длина словаря отличается от dataframeПанды CONCAT словарь для dataframe

>>> df 
     A  B  C 
0 0.46324 0.32425 0.42194 
1 0.10596 0.35910 0.21004 
2 0.69209 0.12951 0.50186 
3 0.04901 0.31203 0.11035 
4 0.43104 0.62413 0.20567 
5 0.43412 0.13720 0.11052 
6 0.14512 0.10532 0.05310 

и

test = {"One": [0.23413, 0.19235, 0.51221], "Two": [0.01293, 0.12235, 0.63291]} 

Я m пытается добавить test в df, при смене ключей на "D" и "C" и я посмотрел

http://pandas.pydata.org/pandas-docs/stable/merging.html и http://pandas.pydata.org/pandas-docs/stable/generated/pandas.concat.html

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

Я попытался:

pd.concat([df, test], axis=1, ignore_index=True, keys=["D", "E"]) 
pd.concat([df, test], axis=1, ignore_index=True) 

, но я не имею никакой удачи, результат Я пытаюсь достичь

df 
     A  B  C  D  E 
0 0.46324 0.32425 0.42194 0.23413 0.01293 
1 0.10596 0.35910 0.21004 0.19235 0.12235 
2 0.69209 0.12951 0.50186 0.51221 0.63291 
3 0.04901 0.31203 0.11035  NaN  NaN 
4 0.43104 0.62413 0.20567  NaN  NaN 
5 0.43412 0.13720 0.11052  NaN  NaN 
6 0.14512 0.10532 0.05310  NaN  NaN 
+0

Вам нужен индекс для соответствия «Один» и «Два», или должны ли новые строки в 'df' быть 7 и 8? – Alexander

+0

Я хотел бы, чтобы верхняя строка была '' A "| «В» | «C» | «D» | «E», если возможно, в отличие от «A» | «В» | «C» | «Один» | «Два», которые, как я думаю, будут созданы – Lukasz

+0

Если вы добавляете новые столбцы, то должно иметь такое же количество строк, что и dataframe (7). Их всего три, поэтому я предположил, что вы добавляете строки в dataframe. – Alexander

ответ

3

Единственный путь вы можете сделать это с:

df.join(pd.DataFrame(test).rename(columns={'One':'D','Two':'E'})) 

      A  B  C  D  E 
0 0.46324 0.32425 0.42194 0.23413 0.01293 
1 0.10596 0.35910 0.21004 0.19235 0.12235 
2 0.69209 0.12951 0.50186 0.51221 0.63291 
3 0.04901 0.31203 0.11035  NaN  NaN 
4 0.43104 0.62413 0.20567  NaN  NaN 
5 0.43412 0.13720 0.11052  NaN  NaN 
6 0.14512 0.10532 0.05310  NaN  NaN 

, потому что, как правильно @Alexander упоминается число строк которые сцепляются должны совпадать. В противном случае, как и в вашем случае, недостающие строки будут заполнены NaN

2

Предполагая, что вы хотите добавить их как строки:

>>> pd.concat([df, pd.DataFrame(test.values(), columns=df.columns)], ignore_index=True) 
     A  B  C 
0 0.46324 0.32425 0.42194 
1 0.10596 0.35910 0.21004 
2 0.69209 0.12951 0.50186 
3 0.04901 0.31203 0.11035 
4 0.43104 0.62413 0.20567 
5 0.43412 0.13720 0.11052 
6 0.14512 0.10532 0.05310 
7 0.01293 0.12235 0.63291 
8 0.23413 0.19235 0.51221 

Если добавлены как новые столбцы:

df_new = pd.concat([df, pd.DataFrame(test.values()).T], ignore_index=True, axis=1) 
df_new.columns = \ 
    df.columns.tolist() + [{'One': 'D', 'Two': 'E'}.get(k) for k in test.keys()] 

>>> df_new 
     A  B  C  E  D 
0 0.46324 0.32425 0.42194 0.01293 0.23413 
1 0.10596 0.35910 0.21004 0.12235 0.19235 
2 0.69209 0.12951 0.50186 0.63291 0.51221 
3 0.04901 0.31203 0.11035  NaN  NaN 
4 0.43104 0.62413 0.20567  NaN  NaN 
5 0.43412 0.13720 0.11052  NaN  NaN 
6 0.14512 0.10532 0.05310  NaN  NaN 

заказа не гарантируется в словарях (например, test), поэтому имена новых столбцов на самом деле должны быть сопоставлены с ключами.

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