Как я могу заполнить и заполнить одновременно? - PullRequest
0 голосов
/ 05 июля 2018

Допустим, у меня есть три фрейма данных:

from pandas import DataFrame

df1 = DataFrame([
    [1],
    [3],
    [4]
],
    index=[1, 3, 4],
    columns=['value1']
)

df2 = DataFrame([
    [5],
    [6],
    [7],
],
    index=[5, 6, 7],
    columns=['value2']
)

df3 = DataFrame([
    [5, 9],
    [6, 10],
    [7, 11],
    [8, 12]
],
    index=[5, 6, 7, 8],
    columns=['value1', 'value2']
)

Использование

concat([df1, df2, df3], sort=True, axis=1)

теперь даст мне

   value1  value2  value1  value2
1     1.0     NaN     NaN     NaN
3     3.0     NaN     NaN     NaN
4     4.0     NaN     NaN     NaN
5     NaN     5.0     5.0     9.0
6     NaN     6.0     6.0    10.0
7     NaN     7.0     7.0    11.0
8     NaN     NaN     8.0    12.0

Теперь, как мне получить результат

   value1  value2
1     1.0     NaN
3     3.0     NaN
4     4.0     NaN
5     5.0     5.0
6     5.0     6.0
7     7.0     7.0
8     8.0     12.0

Другими словами, как можно объединить столбцы с одинаковыми именами "влево"? Я ищу универсальное решение, которое может принимать любое количество нескольких столбцов с одним и тем же именем (а также иметь имена столбцов, которые встречаются только один раз).

1 Ответ

0 голосов
/ 05 июля 2018

Использование DataFrame.combine_first:

df = df1.combine_first(df2).combine_first(df3)
print (df)
   value1  value2
1     1.0     NaN
3     3.0     NaN
4     4.0     NaN
5     5.0     5.0
6     6.0     6.0
7     7.0     7.0
8     8.0    12.0

Более общим решением для работы с list of DataFrames является использование reduce:

from functools import reduce

dfs = [df1, df2, df3]
df = reduce(lambda l,r: pd.DataFrame.combine_first(l,r), dfs)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...