如何切片数据框并将其重组为新的数据框

时间:2019-05-14 02:28:06

标签: python pandas dataframe

我得到一个这样的数据框:

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 个答案:

答案 0 :(得分:1)

我认为您可以先用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

答案 1 :(得分:1)

使用两次合并即可实现。

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')


如果您有多个数据框,请将其放入列表中,并使用带有reduce的理解。

from functools import reduce
dfs = [df1, df2, df3]
reduce(lambda left, right: left.merge(right, how='outer', on='letter'), dfs)

答案 2 :(得分:0)

我的代码如下:

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

答案 3 :(得分:0)

只要您有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

答案 4 :(得分:0)

我认为简单的解决方案是使用pd.concat。仅需要set_indexA之前的这些子数据帧的BCpd.concat ...列中。对于具有未知名称的大量列的df,可以通过使用iterzip轻松完成,如下所示:

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

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

接下来,使用listcomp创建set_indexcols_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