python - 如何在Python中获取每个有序行的值的前3个元素
问题描述
我有一个数据类型为字符串的 DataFrame,如下所示:
ID | 变量1 | 变量2 | 变量 3 | 变量4 | 变量5 |
---|---|---|---|---|---|
1 | 一种 | 乙 | C | D | 乙 |
2 | 乙 | C | D | ||
3 | C | D | 乙 | ||
4 | 一种 | C | 乙 |
我想为每一行选择前 3 个元素,如下所示:
ID | 变量1 | 变量2 | 变量 3 | 变量4 | 变量5 | 变量6 |
---|---|---|---|---|---|---|
1 | 一种 | 乙 | C | D | 乙 | A,B,C |
2 | 乙 | C | D | B,C,D | ||
3 | C | D | 乙 | C,D,E | ||
4 | 一种 | C | 乙 | 高手 |
解决方案
试试这个:
df['Var6'] = df.apply(lambda x: [y for y in x.values if y != ''][:3], axis=1)
结果df:
Var1 Var2 Var3 Var4 Var5 Var6
1 A B C D E [A, B, C]
2 B C D [B, C, D]
3 C D E [C, D, E]
4 A C E [A, C, E]
如果您希望结果为逗号分隔的字符串,请进一步使用:
df['Var6'] = df['Var6'].str.join(', ')
结果df:
Var1 Var2 Var3 Var4 Var5 Var6
1 A B C D E A, B, C
2 B C D B, C, D
3 C D E C, D, E
4 A C E A, C, E
如果您想一步完成,请使用:
df['Var6'] = df.apply(lambda x: ','.join([y for y in x.values if y != ''][:3]), axis=1)
编辑
ID
当我提供答案时,我将示例数据解释为行索引,尤其是当 OP 提到 DataFrame 的数据类型为字符串时,并且当她从每行中选择前 3 个元素时,ID
未选择标记列中的值。
但是,我看到其他一些答案被ID
视为数据列。为了完整起见,我想添加代码,以防万一ID
是一个数据列,而它的值仍然不能为每行中的前 3 个元素选择。
万一ID
是数据列但不被选中:稍微调整代码如下:
df1 = df.set_index('ID') # temporarily set column ID as index
# same code as my main answer except to replace df by df1
df1['Var6'] = df1.apply(lambda x: ','.join([y for y in x.values if y != ''][:3]), axis=1)
df = df1.reset_index() # reset the index to move ID back to data column
推荐阅读
- android - HorizontalScrollView 中的 Android 中心子项
- angular - Angular 4:预期 0 类型参数,但得到 1
- ios - Swift4.1:如何在不打开应用程序的情况下从通知列表中删除传递的通知
- javascript - 我的功能没有以正确的方式加载
- jquery - 在上一个 div 中选择具有指定类名的元素
- google-sheets - 将公式应用于列
- regex - 如何根据多个正则表达式在浏览器中为纯文本文件着色?
- python - 如何在特定条件下将 Pandas 数据框的一行拆分为两行
- elassandra - Elassandra 未在 Windows 10 上启动
- reactjs - ReactJS - TypeError:无法读取未定义的属性“名称”