2015-05-07 168 views
2

我有一个包含“赢家”它看起来像这样的列表中的一列数据帧:如何将中间总和列添加到熊猫数据框?

+---+--------+ 
| | Winner | 
+---+--------+ 
| 0 | A  | 
| 1 | C  | 
| 2 | D  | 
| 3 | D  | 
| 4 | A  | 
| 5 | B  | 
+---+--------+ 

但我挣扎中间得分列添加到该数据帧。我想实现的是:

+---+--------+---+---+---+---+ 
| | Winner | A | B | C | D | 
+---+--------+---+---+---+---+ 
| 0 | A  | 1 | 0 | 0 | 0 | 
| 1 | C  | 1 | 0 | 1 | 0 | 
| 2 | D  | 1 | 0 | 1 | 1 | 
| 3 | D  | 1 | 0 | 1 | 2 | 
| 4 | A  | 2 | 0 | 1 | 2 | 
| 5 | B  | 2 | 1 | 1 | 2 | 
+---+--------+---+---+---+---+ 

有没有办法添加这些列?

编辑:对不起,我忘了补充一点,我想熊猫从该列中产生这些中间分数。所以我不想手动添加它们。

+0

你不张贴或说明了这些中间分数从何而来? – EdChum

+0

你刚才试过'df ['A'] = [1,1,1,1,2,2]'...等等吗? – EdChum

+0

对不起,我忘了补充一点,我希望熊猫能够从这一栏中生成这些中间分数。所以我不想手动添加它们。 –

回答

3

建立初步框架:

>>> import pandas as pd 
>>> df = pd.DataFrame(['A', 'C', 'D', 'D', 'A', 'B'], columns=['Winner']) 

我们将使用唯一的列名,因此藏匿其中:

>>> names = ('A', 'B', 'C', 'D') # sorted(df["Winner"].unique().tolist()) 

派生的 “赢” 活动框架:

>>> events = pd.DataFrame([[int(i==j) for i in names] for j in df["Winner"]], 
          columns=names) 

events看起来像这样:

>>> events 
    A B C D 
0 1 0 0 0 
1 0 0 1 0 
2 0 0 0 1 
3 0 0 0 1 
4 1 0 0 0 
5 0 1 0 0 

现在我们可以使用熊猫'cumulative sum function

>>> events.cumsum() 
    A B C D 
0 1 0 0 0 
1 1 0 1 0 
2 1 0 1 1 
3 1 0 1 2 
4 2 0 1 2 
5 2 1 1 2 

最后,刚刚加入你所需要的:

>>> df.join(events.cumsum()) 
    Winner A B C D 
0  A 1 0 0 0 
1  C 1 0 1 0 
2  D 1 0 1 1 
3  D 1 0 1 2 
4  A 2 0 1 2 
5  B 2 1 1 2 
+0

这工作完美,也使熊猫“点击”在我的脑海。非常感谢你。 –

+0

@DaniëlFranke,如果此答案解决了您的原始问题,请将其标记为[accepted](http://stackoverflow.com/tour)。谢谢! – miku

相关问题