我有一个示例数据集,其中包含一组列名。在移动数据时,我每行都在每行中打印字母,如下所示。
我正在尝试移动每一行的值以匹配任一相应的列。我曾尝试这样做pd.shift(),但没有取得太大的成功。我试图得到下面看到的。有什么想法吗?
import pandas as pd
df = pd.DataFrame({'A': list('AAAAA'),
'B': list('CBBDE'),
'C': list('DDCEG'),
'D': list('EEDF '),
'E': list('FFE '),
'F': list('GGF '),
'G': list(' G ')})
A B C D E F G
0 A C D E F G
1 A B D E F G
2 A B C D E F G
3 A D E F
4 A E G
之后:
A B C D E F G
0 A C D E F G
1 A B D E F G
2 A B C D E F G
3 A D E F
4 A E G
答案 0 :(得分:3)
这是更多列表pivot
问题
s=df.mask(df=='').stack().reset_index()
s.pivot(index='level_0',columns=0,values=0)
Out[34]:
0 A B C D
level_0
0 A B C D
1 A NaN C NaN
2 A NaN C D
答案 1 :(得分:3)
这是广播的比较方法。这将非常快,但是确实具有更高的内存复杂性。
a = df.to_numpy()
b = df.columns.to_numpy()
pd.DataFrame(np.equal.outer(a, b).any(1) * b, columns=b)
A B C D E F G
0 A C D E F G
1 A B D E F G
2 A B C D E F G
3 A D E F
4 A E G
答案 2 :(得分:1)
这里是T
,stack
,merge
的一种方式:
pivot
输出:
new_df = df.stack().reset_index()
(new_df.merge(new_df, left_on=['level_0', 'level_1'],
right_on=['level_0',0],
how='left')
.pivot('level_0', 'level_1', '0_y')
)