我想将数据框的一行复制到它的第一列中的元素。
我有以下数据框:
columns_A columns_B
0 [1,2,3,4] ['bob', 'mary']
1 [7,9] ['banana', 'apple']
我想要的结果是:
columns_A columns_B
0 1 ['bob', 'mary']
1 2 ['bob', 'mary']
2 3 ['bob', 'mary']
3 4 ['bob', 'mary']
4 7 ['banana', 'apple']
5 9 ['banana', 'apple']
现在我可以访问 column_A 的列表,但我无法将 column_B 中的相应列表分配给每个元素。 下面的代码让我的第一行 column_B 到所有元素。我不知道如何根据第 1 行在 column_A 中的位置来归属该行。
for line1 in df.column_A:
for i in line1:
s= {i : df.column_B[0]}
print s
谢谢你的帮助
请您参考如下方法:
我想你可以使用 numpy.repeat按长度重复值 str.len和 chain 的嵌套 lists 的平面值:
from itertools import chain
df2 = pd.DataFrame({
"columns_B": np.repeat(df.columns_B.values, df.columns_A.str.len()),
"columns_A": list(chain.from_iterable(df.columns_A))})
print (df2)
columns_A columns_B
0 1 [bob, mary]
1 2 [bob, mary]
2 3 [bob, mary]
3 4 [bob, mary]
4 7 [banana, apple]
5 9 [banana, apple]
纯 pandas 解决方案是 join Series 由 DataFrame 构造函数和 stack 创建:
df2 = pd.DataFrame(df.columns_A.values.tolist())
.stack()
.reset_index(level=1, drop=True)
.astype(int)
.rename('columns_A')
print (df2)
0 1
0 2
0 3
0 4
1 7
1 9
Name: columns_A, dtype: int32
print (df.drop('columns_A', axis=1).join(df2).reset_index(drop=True))
columns_B columns_A
0 [bob, mary] 1
1 [bob, mary] 2
2 [bob, mary] 3
3 [bob, mary] 4
4 [banana, apple] 7
5 [banana, apple] 9
