以CSV格式计算行中的特定值

时间:2016-06-28 14:11:14

标签: python-2.7 csv pandas

我有一个csv文件:

A   D1        B   D2    C         D3    E   TotalAction
1   action  0.5  action 0.35    null    a   2
2   0       0.75    0   0.45    action  b   1
3   action  1    action 0.85    action  c   3

我想计算一下'行动的数量'每行中的关键字,并创建一个新列给出输出。所以输出文件就是这样的。

compareTo

使用熊猫前进的最佳方法是什么?感谢

2 个答案:

答案 0 :(得分:3)

您可以在apply的行中使用str.contains作为该关键字:

In [21]: df.apply(lambda x: x.str.contains('action').sum(), axis=1)
Out[21]:
0    2
1    1
2    3
dtype: int64

df['TotalAction'] = df.apply(lambda x: x.str.contains('action').sum(), axis=1)

In [23]: df
Out[23]:
   A      D1     B      D2     C      D3  E  TotalAction
0  1  action  0.50  action  0.35    null  a            2
1  2       0  0.75       0  0.45  action  b            1
2  3  action  1.00  action  0.85  action  c            3

修改

尽管您可以使用isin更轻松,更快速地完成此操作,然后对各行求和:

In [45]: df.isin(['action']).sum(axis=1)
Out[45]:
0    2
1    1
2    3
dtype: int64

注意:您需要将字符串关键字包装到list

答案 1 :(得分:2)

您可以与.sum(axis=1)一起使用select_dtypes(仅用于选择字符串列):

In [95]: df['TotalAction'] = (df.select_dtypes(include=[object]) == 'action').sum(axis=1)

In [96]: df
Out[96]:
   A      D1     B      D2     C      D3  E  TotalAction
0  1  action  0.50  action  0.35    null  a            2
1  2       0  0.75       0  0.45  action  b            1
2  3  action  1.00  action  0.85  action  c            3

时间针对30K行DF:

In [3]: df = pd.concat([df] * 10**4, ignore_index=True)

In [6]: df.shape
Out[6]: (30000, 7)

In [4]: %timeit df.apply(lambda x: x.str.contains('action').sum(), axis=1)
1 loop, best of 3: 7.89 s per loop

In [5]: %timeit (df.select_dtypes(include=[object]) == 'action').sum(axis=1)
100 loops, best of 3: 7.08 ms per loop

In [7]: %timeit df.isin(['action']).sum(axis=1)
10 loops, best of 3: 22.8 ms per loop

结论: apply(...)select_dtypes()方法慢1114倍

<强>解释

In [92]: df.select_dtypes(include=[object])
Out[92]:
       D1      D2      D3  E
0  action  action    null  a
1       0       0  action  b
2  action  action  action  c

In [93]: df.select_dtypes(include=[object]) == 'action'
Out[93]:
      D1     D2     D3      E
0   True   True  False  False
1  False  False   True  False
2   True   True   True  False

In [94]: (df.select_dtypes(include=[object]) == 'action').sum(axis=1)
Out[94]:
0    2
1    1
2    3
dtype: int64