【问题标题】:Remove value and count others in a comma separated list in a dataframe column在数据框列的逗号分隔列表中删除值并计算其他值
【发布时间】:2021-10-09 03:32:28
【问题描述】:

我有以下例子df:

df1 = pd.DataFrame({'name':['Sara',  'John', 'Christine'],

                   'trip1 places': [np.nan , 4, 0],
                   'trip2 places': [1, 6, 2],
                   'trip3 places': [2, 0, 2],
                   'trip4 places': [2, 2, 2]})

df1

看起来像:

    name    trip1 places    trip2 places    trip3 places    trip4 places
0   Sara       NaN               1               2               2
1   John       4.0               6               0               2
2   Christine  0.0               2               2               2

我要做的是找到trips1 places、trip3 places 和trip4 places 的有效行程数。这意味着应该删除等于 0 的值并计算其他值的数量。

我的方法是将所有目标值添加到列表中并删除 0 值然后计算列表项。

df1.fillna(0, inplace=True)

然后将感兴趣的行程添加到列表中:

df1['trips'] = df1[['trip1 places','trip3 places','trip4 places']].values.tolist()

它给出:

    name    trip1 places    trip2 places    trip3 places    trip4 places    trips
0   Sara        0.0             1              2                2   [0.0, 2.0, 2.0]
1   John        4.0             6              0                2   [4.0, 0.0, 2.0]
2   Christine   0.0             2              2                2   [0.0, 2.0, 2.0]

现在我需要从每个列表中删除 0.0 并计算其他项目。请注意,0.0 可以在其他行中重复。

我尝试添加掩码,然后使用len 计算项目,但失败了!

m = [element for element in df1['trips'] if element != 0]

预期输出:

    name    trip1 places    trip2 places    trip3 places    trip4 places    effective trips     # effective trips
0   Sara          0.0            1               2             2                [0.0, 2.0, 2.0]     2
1   John          4.0            6              0              2                [4.0, 0.0, 2.0]     2
2   Christine     0.0            2              2              2                [0.0, 2.0, 2.0]     2

【问题讨论】:

    标签: python python-3.x pandas list dataframe


    【解决方案1】:

    尝试使用 stack ,获取列表后执行 str.len

    df1['new list'] = df1[['trip1 places','trip3 places','trip4 places']].stack().loc[lambda x : x!=0].groupby(level=0).agg(list)
    Out[166]: 
    0    [2.0, 2.0]
    1    [4.0, 2.0]
    2    [2.0, 2.0]
    dtype: object
    
    
    df['off trips'] = df1['new list'].str.len()
    
    Out[167]: 
    0    2
    1    2
    2    2
    dtype: int64
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-24
      相关资源
      最近更新 更多