获取有关每行的统计信息并将其放入新列。熊猫

时间:2014-08-09 09:30:02

标签: python pandas dataframe

所以我有一个带有一些值的数据帧。这是我的数据框:

|in|x|y|z|
+--+-+-+-+
| 1|a|a|b|
| 2|a|b|b|
| 3|a|b|c|
| 4|b|b|c|

我想获得每行的唯一值的数量,以及不等于列x中的值的值的数量。结果应如下所示:

|in | x | y | z | count of not x |unique|
+---+---+---+---+---+---+
| 1 | a | a | b | 1 | 2 |
| 2 | a | b | b | 2 | 2 |
| 3 | a | b | c | 2 | 3 |
| 4 | b | b |nan| 0 | 1 |

我可以在这里做出一些肮脏的决定。但必须有一些优雅的方式来做到这一点。我的思绪正在转变下降(这不适用于系列);变成数组和.unique(); df.iterrows()我想逃避;和.apply在每一行。

1 个答案:

答案 0 :(得分:3)

以下是使用apply的解决方案。

df['count of not x'] = df.apply(lambda x: (x[['y','z']] != x['x']).sum(), axis=1)
df['unique'] = df.apply(lambda x: x[['x','y','z']].nunique(), axis=1)

获取非x计数的非应用解决方案:

df['count of not x'] = (~df[['y','z']].isin(df['x'])).sum(1)

无法想到任何与众不同的东西。这使用apply,但可能更快,具体取决于数据的形状。

df['unique'] = df[['x','y','z']].T.apply(lambda x: x.nunique())