我有一个数据帧,其数据类型为字符串,如下所示:
ID | Var1 | Var2 | Var3 | 是4 | Var5 |
---|---|---|---|---|---|
1个 | 一种 | 乙 | C | d | E |
2个 | 乙 | C | d | ||
3 | C | d | E | ||
4 | 一种 | C | E |
我想为每一行选择前3个元素,如下所示:
ID | Var1 | Var2 | Var3 | 是4 | Var5 | Var6 |
---|---|---|---|---|---|---|
1个 | 一种 | 乙 | C | d | E | A,B,C |
2个 | 乙 | C | d | B,C,D | ||
3 | C | d | E | C,D,E | ||
4 | 一种 | C | E | 高手 |
试试这个:
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的数据类型为字符串,并且当她从每一行中选择前三个元素时,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
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句