Pandas交叉连接数据帧和系列



我有一个示例数据帧

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.tilenumpy.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.tilenp.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]
)

最新更新