所以我有一个带有一些值的数据帧。这是我的数据框:
|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在每一行。
答案 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())