如何在Python中获得前3个元素,每个有序行都有值
我有一个数据框,数据类型为字符串,如下所示: 身份证件 Var1 Var2 Var3 Var4 Var5 1. A. B C D E 2. B C D 3. C D E 4. A. C E 试试这个:如何在Python中获得前3个元素,每个有序行都有值,python,pandas,Python,Pandas,我有一个数据框,数据类型为字符串,如下所示: 身份证件 Var1 Var2 Var3 Var4 Var5 1. A. B C D E 2. B C D 3. C D E 4. A. 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
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]
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]
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的数据类型为string时,并且当她从每行中选取前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
利用df.values.tolist()的替代解决方案
将熊猫作为pd导入
#使用空字符串的工作示例
df=pd.DataFrame({“Var1”:[“A”,“”,“”,,“A”],
“Var2”:[“B”、“B”、“0”、“0],
“Var3”:[“C”、“C”、“C”、“C”],
“Var4”:[“D”、“D”、“D”和“,”],
“Var5”:[“E”,“E”,“E”]
})
df[“Var6”]=df.values.tolist()
df[“Var6”]=df[“Var6”].map(lambda x:“,”.join([i为x中的i,如果i!=”“][:3]))
df
#无的工作示例
df=pd.DataFrame({“Var1”:[“A”,无,无,“A”],
“Var2”:[“B”,“B”,无,无],
“Var3”:[“C”、“C”、“C”、“C”],
“Var4”:[“D”,“D”,“D”,无],
“Var5”:[“E”,无,“E”,“E”]
})
df[“Var6”]=df.values.tolist()
df[“Var6”]=df[“Var6”].map(lambda x:“,”.join([i为x中的i,如果i不是None][:3]))
df
您可以将堆栈
与groupby.head(3)
和chaingroupby.agg(','.join)
尝试使用
stack
然后使用groupby
head
df['out'] = df.stack().loc[lambda x : x!=''].groupby(level=0).head(3).groupby(level=0).agg(','.join)
Out[277]:
0 A,B,C
1 B,C,D
2 C,D,E
3 A,C,E
dtype: object
或
@ShubhamSharma BeNY也打败了我-谢谢,这很有道理!