将列重新排列到熊猫的下一行

时间:2019-03-18 19:12:04

标签: python python-3.x pandas

我有一个具有以下格式的数据框:-

ID   A    B    C     D     E     F
W1   a1   b1   c1    d1    e1    f1
W2   a2   b2   c2    d2    e2    f2
W3   a3   b3   c3    d3    e3    f3
W4   a4   b4   c4    d4    e4    f4
W5   a5   b5   c5    d5    e5    f5
W6   a6   b6   c6    d6    e6    f6

如果我想获得以下格式。使用熊猫。

ID   A    B    E     F
W1   a1   b1   e1    f1
W1   c1   d1   e1    f1
W2   a2   b2   e2    f2
W2   c2   d2   e2    f2
W3   a3   b3   e3    f3
W3   c3   d3   e3    f3
W4   a4   b4   e4    f4
W4   c4   d4   e4    f4
W5   a5   b5   e5    f5
W5   c5   d5   e5    f5
W6   a6   b6   e6    f6
W6   c6   d6   e6    f6

然后将此数据帧分解为多个数据帧,以将第1列作为文件名写入单个csv文件。

W1.csv

W1   a1   b1   e1    f1
W1   c1   d1   e1    f1 

W2.csv

W2   a2   b2   e2    f2
W2   c2   d2   e2    f2

W3.csv

W3   a3   b3   e3    f3
W3   c3   d3   e3    f3

W4.csv

W4   a4   b4   e4    f4
W4   c4   d4   e4    f4

W5.csv

W5   a5   b5   e5    f5
W5   c5   d5   e5    f5

W6.csv

W6   a6   b6   e6    f6
W6   c6   d6   e6    f6

2 个答案:

答案 0 :(得分:1)

如果确定C->AD->B,则可以重新合并帧,然后重新合并ffill。通常,d仅需要将要移动的列与应该放置在其下的列相关联。


d = dict(C='A', D='B')
u = df[[*d]].copy()
f = df.drop([*d], axis=1)

g = pd.concat([f, u.rename(columns=d)], sort=False).sort_index().ffill().groupby('ID')

现在,您可以选择使用g将每个单独的帧写入文件:

for _, group in g:
    print(group, end='\n\n')

   ID   A   B   E   F
0  W1  a1  b1  e1  f1
0  W1  c1  d1  e1  f1

   ID   A   B   E   F
1  W2  a2  b2  e2  f2
1  W2  c2  d2  e2  f2

   ID   A   B   E   F
2  W3  a3  b3  e3  f3
2  W3  c3  d3  e3  f3

   ID   A   B   E   F
3  W4  a4  b4  e4  f4
3  W4  c4  d4  e4  f4

   ID   A   B   E   F
4  W5  a5  b5  e5  f5
4  W5  c5  d5  e5  f5

   ID   A   B   E   F
5  W6  a6  b6  e6  f6
5  W6  c6  d6  e6  f6

答案 1 :(得分:1)

在将数据框分为两部分,填充nan并使用for循环生成文件之后,使用熊猫concat()

df1 = df[['ID', 'A', 'B', 'E', 'F']]
df2 = df[['ID', 'C', 'D']]
df2.columns = ['ID', 'A', 'B']
df = pd.concat([df1, df2], sort = True).sort_values('ID').fillna(method='ffill').reset_index(drop = True)[['ID','A','B','E','F']]
for w in df.ID.unique():
    df[df.ID == w].to_csv(w + '.csv')