我正在尝试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'])
答案 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替换X
,M
,''
的一种方法,将值和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