您有混合数据框 - int 与 str 和 list 值(非常有问题,因为许多函数会引发错误),所以首先将所有数字转换为 str where 和掩码是 to_numeric使用参数errors='coerce' 将非数字转换为NaN:
dfx.A = dfx.A.where(pd.to_numeric(dfx.A, errors='coerce').isnull(), dfx.A.astype(str))
print (dfx)
A B
0 1 2
1 A B
2 [C, D] E
然后通过np.repeat 创建新的DataFrame 并通过chain.from_iterable 创建lists 的平面值:
df = pd.DataFrame({
"B": np.repeat(dfx.B.values, dfx.A.str.len()),
"A": list(chain.from_iterable(dfx.A))})
print (df)
A B
0 1 2
1 A B
2 C E
3 D E
Pure pandas 解决方案将列A 转换为list,然后创建新的DataFrame.from_records。然后drop原创专栏A和joinstackeddf:
df = pd.DataFrame.from_records(dfx.A.values.tolist(), index = dfx.index)
df = dfx.drop('A', axis=1).join(df.stack().rename('A')
.reset_index(level=1, drop=True))[['A','B']]
print (df)
A B
0 1 2
1 A B
2 C E
2 D E
如果需要lists,请使用groupby 和apply tolist:
print (df.groupby('B')['A'].apply(lambda x: x.tolist()).reset_index())
B A
0 2 [1]
1 B [A]
2 E [C, D]
但如果需要list,仅当length 的值更多,因为1 是必要的if..else:
print (df.groupby('B')['A'].apply(lambda x: x.tolist() if len(x) > 1 else x.values[0])
.reset_index())
B A
0 2 1
1 B A
2 E [C, D]