Конкат / объединение / объединение нескольких фреймов данных на основе индекса (числа) строк каждого отдельного фрейма данных - PullRequest
0 голосов
/ 02 октября 2018

Я хочу прочитать каждую n-ю строку списка DataFrames и создать новые DataFrames, добавив все N-ые строки.

Допустим, у нас есть следующие DataFrames:

>>> df1
   A    B    C    D
0 -0.8 -2.8 -0.3 -0.1
1 -0.1 -0.9  0.2 -0.7
2  0.7 -3.3 -1.1 -0.4 

>>> df2
   A    B    C    D
0  1.4 -0.7  1.5 -1.3
1  1.6  1.4  1.4  0.2
2 -1.4  0.2 -1.7  0.7 

>>> df3
   A    B    C    D
0  0.3 -0.5 -1.6 -0.8
1  0.2 -0.5 -1.1  1.6
2 -0.3  0.7 -1.0  1.0

Я использовал следующий подход для получения нужного значения df:

df = pd.DataFrame()

df_list = [df1, df2, df3]

for i in range(len(df1)):
    for x in df_list:
        df = df.append(x.loc[i], ignore_index = True)

Вот результат:

>>> df
   A    B    C    D
0 -0.8 -2.8 -0.3 -0.1
1  1.4 -0.7  1.5 -1.3
2  0.3 -0.5 -1.6 -0.8
3 -0.1 -0.9  0.2 -0.7
4  1.6  1.4  1.4  0.2
5  0.2 -0.5 -1.1  1.6
6  0.7 -3.3 -1.1 -0.4
7 -1.4  0.2 -1.7  0.7
8 -0.3  0.7 -1.0  1.0 

Мне было просто интересно, есть ли способ пандпереписать этот код, который будет делать то же самое (возможно, с помощью .iterrows, pd.concat, pd.join или pd.merge)?

Cheers

Обновление Просто добавление одного df за другим - это не то, что я ищу здесь.

Код должен делать:

df.row1 = df1.row1
df.row2 = df2.row1
df.row3 = df3.row1
df.row4 = df1.row2
df.row5 = df2.row2
df.row6 = df3.row2
...

Ответы [ 4 ]

0 голосов
/ 03 октября 2018

Для одного выходного фрейма данных можно объединять и сортировать по индексу:

res = pd.concat([df1, df2, df3]).sort_index().reset_index(drop=True)

     A    B    C    D
0 -0.8 -2.8 -0.3 -0.1
1  1.4 -0.7  1.5 -1.3
2  0.3 -0.5 -1.6 -0.8
3 -0.1 -0.9  0.2 -0.7
4  1.6  1.4  1.4  0.2
5  0.2 -0.5 -1.1  1.6
6  0.7 -3.3 -1.1 -0.4
7 -1.4  0.2 -1.7  0.7
8 -0.3  0.7 -1.0  1.0

Для словаря фреймов данных можно объединять, а затем группировать по индексу:

res = dict(tuple(pd.concat([df1, df2, df3]).groupby(level=0)))

Если словарь определен, как указано выше, каждое значение представляет номер строки.Например, res[0] выдаст первую строку из каждого входного кадра данных.

0 голосов
/ 02 октября 2018

Вы можете объединить их, сохранив их исходные индексы в виде столбца, следующим образом:

df_total = pd.concat([df1.reset_index(), df2.reset_index(),
                      df3.reset_index()]) 

>> df_total
   index    A    B    C    D
0      0 -0.8 -2.8 -0.3 -0.1
1      1 -0.1 -0.9  0.2 -0.7
2      2  0.7 -3.3 -1.1 -0.4
0      0  1.4 -0.7  1.5 -1.3
1      1  1.6  1.4  1.4  0.2
2      2 -1.4  0.2 -1.7  0.7
0      0  0.3 -0.5 -1.6 -0.8
1      1  0.2 -0.5 -1.1  1.6
2      2 -0.3  0.7 -1.0  1.0

Затем вы можете создать многоиндексный фрейм данных и упорядочить по индексу:

df_joined = df_total.reset_index(drop=True).reset_index()

>> df_joined
   level_0  index    A    B    C    D
0        0      0 -0.8 -2.8 -0.3 -0.1
1        1      1 -0.1 -0.9  0.2 -0.7
2        2      2  0.7 -3.3 -1.1 -0.4
3        3      0  1.4 -0.7  1.5 -1.3
4        4      1  1.6  1.4  1.4  0.2
5        5      2 -1.4  0.2 -1.7  0.7
6        6      0  0.3 -0.5 -1.6 -0.8
7        7      1  0.2 -0.5 -1.1  1.6
8        8      2 -0.3  0.7 -1.0  1.0

>> df_joined = df_joined.set_index(['index', 'level_0']).sort_index()

>> df_joined

                 A    B    C    D
index level_0                    
0     0       -0.8 -2.8 -0.3 -0.1
      3        1.4 -0.7  1.5 -1.3
      6        0.3 -0.5 -1.6 -0.8
1     1       -0.1 -0.9  0.2 -0.7
      4        1.6  1.4  1.4  0.2
      7        0.2 -0.5 -1.1  1.6
2     2        0.7 -3.3 -1.1 -0.4
      5       -1.4  0.2 -1.7  0.7
      8       -0.3  0.7 -1.0  1.0

Вы можете поместитьвсе это датафрейм просто сделав:

>>  pd.DataFrame(df_joined.values, columns = df_joined.columns)

     A    B    C    D
0 -0.8 -2.8 -0.3 -0.1
1  1.4 -0.7  1.5 -1.3
2  0.3 -0.5 -1.6 -0.8
3 -0.1 -0.9  0.2 -0.7
4  1.6  1.4  1.4  0.2
5  0.2 -0.5 -1.1  1.6
6  0.7 -3.3 -1.1 -0.4
7 -1.4  0.2 -1.7  0.7
8 -0.3  0.7 -1.0  1.0
0 голосов
/ 02 октября 2018

попробуй:

>>> df1 = pd.DataFrame({'A':['-0.8', '-0.1', '0.7'],
...                     'B':['-2.8', '-0.9', '-3.3'],
...                      'C':['-0.3', '0.2', '-1.1'],
...                      'D':['-0.1', '-0.7', '-0.4']})
>>>
>>> df2 = pd.DataFrame({'A':['1.4', '1.6', '-1.4'],
...                     'B':['-0.7', '1.4', '0.2'],
...                      'C':['1.5', '1.4', '-1.7'],
...                      'D':['-1.3', '0.2', '0.7']})
>>>

>>> df3 = pd.DataFrame({'A':['0.3', '0.2', '-0.3'],
...                     'B':['-0.5', '-0.5', '0.7'],
...                      'C':['-1.6', '-1.1', '-1.0'],
...                      'D':['-0.8', '1.6', '1.0']})

>>> df=pd.concat([df1,df2,df3],ignore_index=True)
>>> print(df)
      A     B     C     D
0  -0.8  -2.8  -0.3  -0.1
1  -0.1  -0.9   0.2  -0.7
2   0.7  -3.3  -1.1  -0.4
3   1.4  -0.7   1.5  -1.3
4   1.6   1.4   1.4   0.2
5  -1.4   0.2  -1.7   0.7
6   0.3  -0.5  -1.6  -0.8
7   0.2  -0.5  -1.1   1.6
8  -0.3   0.7  -1.0   1.0

ИЛИ

df=pd.concat([df1,df2,df3], axis=0, join='outer', ignore_index=True)

Примечание:

axis: whether we will concatenate along rows (0) or columns (1)
join: can be set to inner, outer, left, or right. by using outer its sort it's lexicographically
ignore_index: whether or not the original row labels from should be retained, by default False ,If True, do not use the index labels.
0 голосов
/ 02 октября 2018

Существует pd.concat

df=pd.concat([df1,df2,df3]).reset_index(drop=True)

, рекомендованный Jez

df=pd.concat([df1,df2,df3],ignore_index=True)
...