熊猫:将列转换为列表

Pet*_*rov 1 python pandas

我有一个数据帧

date    member_id   val
2016-06-01  2377264 14
2016-06-01  289719  6
2016-06-02  289719  12
2016-06-02  2377264 1
2016-06-03  289719  0
2016-06-04  289719  0
2016-06-05  289719  3
Run Code Online (Sandbox Code Playgroud)

我需要获取member_id val 2377264 [14,1] 289719 [6,12,0,3]接下来我要对列表中的元素求和,如果列表中有0,则写入.我的意思是

member_id   val
2377264   [15]
289719    [18, 0, 0, 3]
Run Code Online (Sandbox Code Playgroud)

我试过了

vals = []
print df.groupby('member_id')['val'].apply(lambda x: vals.append(x))
Run Code Online (Sandbox Code Playgroud)

但它返回列中的所有None值.我该如何解决这个问题?

Mr.*_*. A 7

试试这个

1.如果你想要val列表

df.groupby('member_id')['val'].apply(lambda x: list(x))
Run Code Online (Sandbox Code Playgroud)

产量

member_id
289719     [6, 12, 0, 0, 3]
2377264             [14, 1]
Name: val, dtype: object
Run Code Online (Sandbox Code Playgroud)

2.获取列表清单

df.groupby('member_id')['val'].apply(lambda x: list(x)).tolist()
Run Code Online (Sandbox Code Playgroud)

产量

[[6, 12, 0, 0, 3], [14, 1]]
Run Code Online (Sandbox Code Playgroud)

得到字典

df.groupby('member_id')['val'].apply(lambda x: list(x)).to_dict()
Run Code Online (Sandbox Code Playgroud)

产量

{2377264: [14, 1], 289719: [6, 12, 0, 0, 3]}
Run Code Online (Sandbox Code Playgroud)

为了得到总和

df.groupby('member_id')['val'].apply(lambda x: sum(x))
Run Code Online (Sandbox Code Playgroud)

产量

member_id
289719     21
2377264    15
Name: val, dtype: int64
Run Code Online (Sandbox Code Playgroud)

5.获得零之间的数字之和

根据你的评论,你需要得到一个val列表和0之间的和元素,为此你应该使用下面的代码

def sumNumberBetweenZero(values):
    valsum=[0]
    for i in values:
      if i==0:
        if valsum[-1]!=0:valsum.append(0)
        valsum.append(0)
      valsum[-1]+=i
    return valsum
Run Code Online (Sandbox Code Playgroud)

5.A. 得到所有元素的总和

sumNumberBetweenZero(df["val"].tolist())
Run Code Online (Sandbox Code Playgroud)

产量

[33L, 0, 0L, 3L]
Run Code Online (Sandbox Code Playgroud)

5.b中 得到组合的总和member_id

df.groupby('member_id')['val'].apply(lambda x: sumNumberBetweenZero((x))
Run Code Online (Sandbox Code Playgroud)

产量

member_id
289719     [18, 0, 0, 3]
2377264             [15]
Name: val, dtype: object
Run Code Online (Sandbox Code Playgroud)

5.iii.以给出的列表为例

sumNumberBetweenZero([1, 2, 5, 0, 3,2, 6, 7, 45, 0, 23, 0, 0, 0, 34])
Run Code Online (Sandbox Code Playgroud)

产量

[8, 0, 63, 0, 23, 0, 0, 0, 34]
Run Code Online (Sandbox Code Playgroud)