压扁熊猫d

2021-05-13 13:34:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试flatten出一个pandasdf。对于下面的df,我尝试在Column E中向上移动名称,并将其他列向右移动。在

import pandas as pd

d = ({
    'D' : ['08:00:00','X','08:10:00','X'],
    'H' : ['1','','1',''],           
    'B' : ['Stop','X','Res','X'],
    'A' : ['X','','X',''],
    'C' : ['En','X','Se','X'],
    'E' : ['M','John','M','Gary'],
    'F' : ['Place','','Place',''],
    })

df = pd.DataFrame(data=d)

输出:

^{pr2}$

鉴于我的预期输出是:

   A     B   C         D     E      F  G
0  X  Stop  En  08:00:00  John  Place  1
1  X   Res  Se  08:10:00  Gary  Place  1

我试过了

df = pd.DataFrame(np.column_stack((df.iloc[::2], df.iloc[1::2, [0]])), columns=['A','B','C','D','E','F','G','H'])

但这会删除名字:

   A     B   C         D  E      F  G  H  
0  X  Stop  En  08:00:00  M  Place  1   
1  X   Res  Se  08:10:00  M  Place  1  
3条回答
网友
1楼 ·

这里有一种将XM''替换为np.nan公司,对值进行排序并dropna,即

c = ['B','C','D','E']

to_ex = ['X','M']
di = dict(zip(to_ex,[pd.np.nan]*len(to_ex)))    

df[c] = df[c].replace(di)

df = df.replace('',pd.np.nan)

df = df.apply( sorted,key=pd.isnull).dropna()


    A   B   C      D       E      F    H
0  X  Stop  En  08:00:00  John  Place  1
1  X   Res  Se  08:10:00  Gary  Place  1

如果我想把每一行都去掉,那就简单点

^{pr2}$
网友
2楼 ·

有一种方法可以做到:

df = df.reindex(sorted(df.columns), axis=1)

sliced = df[::2].copy()

# creating a slot for the 'E' column
sliced.rename(columns={'E': 'F', 'F': 'G'}, inplace=True)    
sliced['E'] = df[1::2]['E'].values

sliced = sliced.reindex(sorted(sliced.columns), axis=1)

输出:

^{pr2}$
网友
3楼 ·

[这里也是新手]嗯…我确信这个用例有一个更好的、可伸缩的实现。然而,我得到了这个黑客解决这个具体的要求

q = df.drop(index=[1,3],inplace=True)
s = df['E'].values.reshape(-1,2)
w =pd.DataFrame(s)
pd.concat([q,w],axis=1)

相关问题