是否有一个pandas函数来转换这些数据,因此它将列显示为a,b,c,d,e或数据字段中的任何内容,并且行计算有多少字母。
import pandas as pd
trans = pd.read_table('output.txt', header=None, index_col=0)
print trans
>>>
1 2 3 4
0
11 a b c NaN
666 a d e NaN
10101 b c d NaN
1010 a b c d
414147 b c NaN NaN
10101 a b d NaN
1242 d e NaN NaN
101 a b c d
411 c d e NaN
444 a b c NaN
相反,我希望输出像这样:
a b c d e
0
11 1 1 1 NaN NaN
666 1 NaN NaN 1 1
函数.stack()几乎完成它但格式错误。
答案 0 :(得分:5)
您也可以使用Pandas get_dummies()
pd.get_dummies(df.unstack().dropna()).groupby(level=1).sum()
结果:
a b c d e
0
11 1 1 1 0 0
666 1 0 0 1 1
10101 0 1 1 1 0
1010 1 1 1 1 0
414147 0 1 1 0 0
10101 1 1 0 1 0
1242 0 0 0 1 1
101 1 1 1 1 0
411 0 0 1 1 1
444 1 1 1 0 0
你可以用你想要的NaN替换零。
在一行中有点模糊。 df.unstack().dropna()
基本上将您的DataFrame展平为一系列并删除了NaN。 get_dummies
给出了所有字母出现的表格,但是对于出栈的DataFrame中的每个级别都是如此。然后,分组和总和将索引与原始形状组合在一起。
答案 1 :(得分:2)
这样的事情可能是:
>>> st = pd.DataFrame(trans.stack()).reset_index(level=0)
>>> st.columns = ['i','c']
>>> st.pivot_table(rows='i', cols='c', aggfunc=len)
c a b c d e
i
11 1 1 1 NaN NaN
101 1 1 1 1 NaN
411 NaN NaN 1 1 1
444 1 1 1 NaN NaN
666 1 NaN NaN 1 1
1010 1 1 1 1 NaN
1242 NaN NaN NaN 1 1
10101 1 2 1 2 NaN
414147 NaN 1 1 NaN NaN