扁平化熊猫df

时间:2018-06-22 02:17:36

标签: python pandas flatten

我正在尝试queue_cond flatten pandas。对于下面的df,我尝试在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)

我的预期输出是:

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

我已经尝试过

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

4 个答案:

答案 0 :(得分:0)

假设:示例中看到的“每隔一行”的规则适用于整个数据集

df2 = df[df.columns[:4]].iloc[::2].reset_index(drop=True)
df3 = df[df.columns[4]].iloc[1::2].reset_index(drop=True)
df4 = df[df.columns[5:]].iloc[::2].reset_index(drop=True)
pd.concat([df2, df3, df4], axis=1)

答案 1 :(得分:0)

[这里也有新手] hm ....我确信此用例有一个更好的可扩展实现。但是,我得到了这个技巧来解决这个特定要求

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)

答案 2 :(得分:0)

这是用np.nan替换XM''的一种方法,将值和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

如果要删除第二行,也许解决方法很简单,即

df['E'] = df['E'].shift(-1)
df = df.loc[0::2]

答案 3 :(得分:0)

这里是一种方法:

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)

输出:

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