首页 > 解决方案 > 如何在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 高手

标签: pythonpandas

解决方案


试试这个:

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 

推荐阅读