Как объединить несколько фреймов данных, содержащих разные фрагменты данных, в один? - PullRequest
1 голос
/ 01 октября 2019

У меня есть несколько - скажем, три - фреймов данных, которые содержат разные строки (иногда они могут перекрываться) другого фрейма данных. Столбцы одинаковы для всех трех dfs. Теперь я хочу создать окончательный фрейм данных, который будет содержать все строки из трех упомянутых фреймов данных. Более того, мне нужно сгенерировать столбец для окончательного df, который будет содержать информацию, в которую входит одно из первых трех dfs этой конкретной строки.

Пример ниже

Исходный кадр данных:

 original_df = pd.DataFrame(np.array([[1,1],[2,2],[3,3],[4,4],[5,5],[6,6]]), columns = ['label1','label2'])

Три dfs, содержащие разные части исходного df:

a = original_df.loc[0:1, columns]
b = original_df.loc[2:2, columns]
c = original_df.loc[3:, columns]

Я хочу получить следующий фрейм данных:

final_df = pd.DataFrame(np.array([[1,1,'a'],[2,2,'a'],[3,3,'b'],[4,4,'c'],\
[5,5,'c'],[6,6,'c']]), columns = ['label1','label2', 'from which df this row'])

или просто использовать целые числа, чтобы пометить изкакой номер строки:

final_df = pd.DataFrame(np.array([[1,1,1],[2,2,1],[3,3,2],[4,4,3],\
[5,5,3],[6,6,3]]), columns = ['label1','label2', 'from which df this row'])

Заранее спасибо!

Ответы [ 3 ]

1 голос
/ 01 октября 2019

См. Этот пост

IIUC, вы можете использовать pd.concat с аргументами keys и names

pd.concat(
    [a, b, c], keys=['a', 'b', 'c'],
    names=['from which df this row']
).reset_index(0)

  from which df this row  label1  label2
0                      a       1       1
1                      a       2       2
2                      b       3       3
3                      c       4       4
4                      c       5       5
5                      c       6       6

ОднакоЯ бы порекомендовал вам хранить эти фрагменты данных в словаре.

parts = {
    'a': original_df.loc[0:1],
    'b': original_df.loc[2:2],
    'c': original_df.loc[3:]
}

pd.concat(parts, names=['from which df this row']).reset_index(0)

  from which df this row  label1  label2
0                      a       1       1
1                      a       2       2
2                      b       3       3
3                      c       4       4
4                      c       5       5
5                      c       6       6

И до тех пор, пока он хранится в виде словаря, вы также можете использовать assign как этот

pd.concat(d.assign(**{'from which df this row': k}) for k, d in parts.items())

   label1  label2 from which df this row
0       1       1                      a
1       2       2                      a
2       3       3                      b
3       4       4                      c
4       5       5                      c
5       6       6                      c

Имейте в виду, что я использовал двойной знак **, потому что у вас есть имя столбца с пробелами. Если бы у вас было имя столбца без пробелов, мы могли бы сделать

pd.concat(d.assign(WhichDF=k) for k, d in parts.items())

   label1  label2 WhichDF
0       1       1       a
1       2       2       a
2       3       3       b
3       4       4       c
4       5       5       c
5       6       6       c
0 голосов
/ 01 октября 2019

Возможно, это может сработать для вас:)

import pandas as pd

# from your post
a = original_df.loc[0:1, columns]
b = original_df.loc[2:2, columns]
c = original_df.loc[3:, columns]

# create new column to label the datasets
a['label'] = 'a'
b['label'] = 'b'
c['label'] = 'c'

# add each df to a list
combined_l = []
combined_l.append(a)
combined_l.append(b)
combined_l.append(c)

# concat all dfs into 1
df = pd.concat(liste_df)
0 голосов
/ 01 октября 2019

Просто создайте список и в конце объедините:

list_df = []
list_df.append(df1)
list_df.append(df2)
list_df.append(df3)
df = pd.concat(liste_df)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...