Pandas dataframe: объединять файлы по общим столбцам - PullRequest
0 голосов
/ 18 ноября 2018

У меня есть коллекция файлов с некоторыми общими столбцами, к которым я хочу присоединиться. В моей настоящей проблеме есть несколько разнородных и общих столбцов. В этом игрушечном примере у меня есть набор файлов a и набор файлов b, которые имеют уникальные столбцы и имеют идентичные столбцы c.

$ for ii in $(ls *.dat) ; do echo " "; echo $ii ; cat $ii ; done

a1.dat
a,c
4,8
1,10
2,3

a2.dat
a,c
1,2
3,4

b1.dat
b,c
2,8
2,10
1,3

b2.dat
b,c
.2,2
.8,4

Я хочу просмотреть эти файлы и объединить их в один фрейм данных. Вот что я пробовал до сих пор. Я объединяю первые файлы, чтобы убедиться, что у меня собраны все имена столбцов, а затем объединяю оставшиеся файлы. Когда я объединяю "внутренним", возвращается пустой фрейм данных.

$ cat s.py 
import pandas as pd
dat = pd.DataFrame()
for ii in [1, 2]:
  for jj in ['a', 'b']:
     d = pd.read_csv('%s%i.dat' % (jj, ii))
     if ii == 1: dat = pd.concat([dat, d])
     else: dat = pd.merge(dat, d, how='outer')
print(dat)

$ Python s.py 
     a    b   c
0  4.0  NaN   8
1  1.0  NaN  10
2  2.0  NaN   3
3  NaN  2.0   8
4  NaN  2.0  10
5  NaN  1.0   3
6  1.0  NaN   2
7  3.0  NaN   4
8  NaN  0.2   2
9  NaN  0.8   4

Это не мой желаемый вывод. Я не понимаю, как я могу сделать эту работу лучше. Желаемый результат был

     a    b   c
0  4.0  2.0   8
1  1.0  2.0  10
2  2.0  1.0   3
3  1.0  0.2   2
4  3.0  0.8   4

Ответы [ 2 ]

0 голосов
/ 18 ноября 2018

Сначала объедините все a и b файлы, а затем объедините их в столбце c как:

import numpy as np
import pandas as pd
a1 = pd.DataFrame({
               'a':   [4,1,2],
               'c': [8,10,3],
               })


a2 = pd.DataFrame({
               'a':   [1,3],
               'c': [2,4],
               })

b1 = pd.DataFrame({
               'b':   [2,2,1],
               'c': [8,10,3],
               })

b2 = pd.DataFrame({
               'b':   [0.2,0.8],
               'c': [2,4],
               })


concat_df_a = pd.concat([a1,a2])
concat_df_b = pd.concat([b1,b2])

print(concat_df_b.merge(concat_df_a,on='c')[['a','b','c']])




a    b   c
0  4  2.0   8
1  1  2.0  10
2  2  1.0   3
3  1  0.2   2
4  3  0.8   4
0 голосов
/ 18 ноября 2018

Есть два шага:

Сначала объедините все файлы одного типа в один DataFrame каждый:

df = {}
for k in ['a', 'b']:
    df[k] = pd.concat([
            pd.read_csv('%s%d.dat' % (k, i)) for i in [1, 2]
            ], axis=0)

Затем объедините объединение в общем столбце 'c',

result = df['a'].merge(df['b'], on='c')[['a', 'b', 'c']]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...