как нарезать фрейм данных и собрать его в новый фрейм данных - PullRequest
1 голос
/ 14 мая 2019

Я получаю такой фрейм данных:

A   YEAR2000    B   YEAR2001    C   YEAR2002
a      1        b     3         a      7
b      3        c     5         e      6
c      6        d     2         f      3
                e     1         g      0

Срезаю каждые два столбца, а затем реорганизую, чтобы сформировать новый фрейм данных, следующим образом:

type    YEAR2000    YEAR2001    YEAR2002
a         1                         7
b         3            3    
c         6            5    
d                      2    
e                      1            6
f                                   3
g                                   0

Я пробовал pd.concat()но случилось что-то не так!Спасибо.

Ответы [ 5 ]

1 голос
/ 14 мая 2019

Использование двойного слияния приведет к этому.

df1 = pd.DataFrame([['a', 1], ['b', 3], ['c', 6]],columns=['letter', 'number'])
df2 = pd.DataFrame([['b', 3], ['c', 5], ['d', 2], ['e', 1]],columns=['letter', 'number'])
df3 = pd.DataFrame([['a', 7], ['e', 6], ['f', 3], ['g', 0]],columns=['letter', 'number'])
pd.merge(pd.merge(df1, df2, how='outer', on='letter'), df3, how='outer', on='letter')

для более чистого вида:

df1.merge(df2, how='outer', on='letter').merge(df3, how='outer', on='letter')


если у вас есть несколько фреймов данных, поместите их в список и используйте понимание суменьшить.

from functools import reduce
dfs = [df1, df2, df3]
reduce(lambda left, right: left.merge(right, how='outer', on='letter'), dfs)
1 голос
/ 14 мая 2019

Я думаю, что вы можете сделать с groupby с axis=1, затем concat

l=[y.set_index(y.columns[0]).dropna() for x , y in df.groupby(np.arange(df.shape[1])//2,axis=1)]
pd.concat(l,axis=1,sort=True)
Out[858]: 
   YEAR2000  YEAR2001  YEAR2002
a       1.0       NaN       7.0
b       3.0       3.0       NaN
c       6.0       5.0       NaN
d       NaN       2.0       NaN
e       NaN       1.0       6.0
f       NaN       NaN       3.0
g       NaN       NaN       0.0
0 голосов
/ 14 мая 2019

Я думаю, что простое решение использует pd.concat. Просто нужно set_index для столбцов A, B, C ... этих субкадров до pd.concat. Для df с огромным количеством столбцов с неизвестными именами это легко достигается с помощью iter и zip следующим образом:

it = iter(df)
cols_list = list(map(list, zip(it, it)))

Out[1854]: [['A', 'YEAR2000'], ['B', 'YEAR2001'], ['C', 'YEAR2002']]

Затем, используя listcomp, создаем список подкадров с set_index из cols_list и pd.concat

dfs = [df[cols].set_index(cols[0]) for cols in cols_list]
pd.concat(dfs, axis=1).dropna(axis=0, how='all')

Out[1868]:
   YEAR2000  YEAR2001  YEAR2002
a       1.0       NaN       7.0
b       3.0       3.0       NaN
c       6.0       5.0       NaN
d       NaN       2.0       NaN
e       NaN       1.0       6.0
f       NaN       NaN       3.0
g       NaN       NaN       0.0
0 голосов
/ 14 мая 2019

На случай, если у вас более 6 столбцов:

num_cols = len(df.columns)
pd.concat([df.iloc[:,i:i+2].dropna()
             .set_index(df.columns[i])
                   for i in range(0,len(df.columns),2)],
          axis=1,
          sort=True
          )

Выход:

    YEAR2000    YEAR2001    YEAR2002
a   1.0         NaN         7.0
b   3.0         3.0         NaN
c   6.0         5.0         NaN
d   NaN         2.0         NaN
e   NaN         1.0         6.0
f   NaN         NaN         3.0
g   NaN         NaN         0.0
0 голосов
/ 14 мая 2019

Мой код выглядит следующим образом:

dataframe_list = []
for i in range(0,origin_df.columns.size):
    if i % 2 == 0:
        dataframe_list.append(origin_df.iloc[:,[i,i + 1]])
new_dataframe = pd.DataFrame()
new_dataframe = pd.concat(dataframe_list,axis = 0)
new_dataframe
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...