我有一个示例数据帧
df = pd.DataFrame({'foo': [1, 2, 3], 'bar': ['A', 'B', 'C']})
和一系列
pd.Series([3, 4, 5, 6], name='buzz')
我想将它们组合起来,以便为每个df
行复制每个系列行因此得到的数据帧与这个等价
pd.DataFrame({
'foo': [1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3],
'bar': ['A', 'B', 'C', 'A', 'B', 'C', 'A', 'B', 'C', 'A', 'B', 'C'],
'buzz': [3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6]
})
我不能将df.merge
与外部联接一起使用,因为这两个列没有公共列。
用普通的蟒蛇很容易做到,但我想知道是否有更好的熊猫解决方案。
您可以将公共列添加到两者中,以便与Series.to_frame
交叉连接,以便将Series
转换为一列DataFrame
:
df = s.to_frame().assign(a=1).merge(df.assign(a=1), on='a').drop('a', axis=1)
print (df)
buzz foo bar
0 3 1 A
1 3 2 B
2 3 3 C
3 4 1 A
4 4 2 B
5 4 3 C
6 5 1 A
7 5 2 B
8 5 3 C
9 6 1 A
10 6 2 B
11 6 3 C
或者:
df = df.assign(a=1).merge(s.to_frame().assign(a=1), on='a').drop('a', axis=1)
print (df)
foo bar buzz
0 1 A 3
1 1 A 4
2 1 A 5
3 1 A 6
4 2 B 3
5 2 B 4
6 2 B 5
7 2 B 6
8 3 C 3
9 3 C 4
10 3 C 5
11 3 C 6
另一个想法是使用numpy.tile
和numpy.repeat
:
df = (df.loc[np.tile(df.index, len(s))]
.reset_index(drop=True)
.assign(buzz = np.repeat(s.to_numpy(), len(df))))
print (df)
foo bar buzz
0 1 A 3
1 2 B 3
2 3 C 3
3 1 A 4
4 2 B 4
5 3 C 4
6 1 A 5
7 2 B 5
8 3 C 5
9 1 A 6
10 2 B 6
11 3 C 6
编辑:如果所有列都是相同的类型(不像这里(,可以使用@Ch3ster解决方案,谢谢:
使用np.tile
和np.repeat
df_arr = np.tile(df.to_numpy(), (len(s), 1))
s_arr = np.repeat(s.to_numpy(), len(df))
df = pd.DataFrame(
np.column_stack([df_arr, s_arr]), columns=[*df.columns, s.name]
)