我想将数据帧的一行复制到我的第一个colulmn中的元素。
我有以下数据框:
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。我不知道如何根据column_A中line1的位置来定义行。
for line1 in df.column_A:
for i in line1:
s= {i : df.column_B[0]}
print s
感谢您的帮助
答案 0 :(得分:3)
我认为您可以numpy.repeat
使用str.len
来表示重复值,lists
可以使用嵌套chain
的平面值:
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]
纯大熊猫解决方案是由Series
构造函数和join
创建的stack
DataFrame
:
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
答案 1 :(得分:3)
使用pd.melt
a, b = df
pd.melt(
df.drop(a, 1).join(df[a].apply(pd.Series)),
b, [0, 1, 2, 3], value_name=a
).dropna()[df.columns.tolist()].astype(df.dtypes) \
.sort_values(b, ascending=False).reset_index(drop=True)
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]