I have a dataframe (df) as such:
A B
1 a
2 b
3 c
有一个序列:S = pd.Series(['x','y','z'])
,我希望将数据框df的每个值分别重复序列中的每个值。期望的结果是这样的:
S A B
x 1 a
y 1 a
z 1 a
x 2 b
y 2 b
z 2 b
x 3 c
y 3 c
z 3 c
我该如何实现这种输出?我考虑过合并或连接,但合并会导致内存错误。我正在处理一个相当大的数据帧和序列。谢谢!
I have a dataframe (df) as such:
A B
1 a
2 b
3 c
有一个序列:S = pd.Series(['x','y','z'])
,我希望将数据框df的每个值分别重复序列中的每个值。期望的结果是这样的:
S A B
x 1 a
y 1 a
z 1 a
x 2 b
y 2 b
z 2 b
x 3 c
y 3 c
z 3 c
我该如何实现这种输出?我考虑过合并或连接,但合并会导致内存错误。我正在处理一个相当大的数据帧和序列。谢谢!
s= pd.Series(['X', 'Y', 'Z', 'A']) #added a character to s to make it length 4
s_n = len(s)
df_n = len(df)
pd.DataFrame(np.repeat(df.values,s_n, axis = 0), columns = df.columns, index = np.tile(s,df_n)).rename_axis('S').reset_index()
S A B
0 X 1 a
1 Y 1 a
2 Z 1 a
3 A 1 a
4 X 2 b
5 Y 2 b
6 Z 2 b
7 A 2 b
8 X 3 c
9 Y 3 c
10 Z 3 c
11 A 3 c
更新:
这里是稍作更改的@A-Za-z的解决方案,可能会更加节省内存,但速度会慢一些:
x = pd.DataFrame(index=range(len(df) * len(S)))
for col in df.columns:
x[col] = np.repeat(df[col], len(s))
x['S'] = np.tile(S, len(df))
旧的不正确回答:
In [94]: pd.concat([df.assign(S=S)] * len(s))
Out[94]:
A B S
0 1 a x
1 2 b y
2 3 c z
0 1 a x
1 2 b y
2 3 c z
0 1 a x
1 2 b y
2 3 c z
设置
df = pd.DataFrame({'A': {0: 1, 1: 2, 2: 3}, 'B': {0: 'a', 1: 'b', 2: 'c'}})
S = pd.Series(['x','y','z'], name='S')
解决方案
#Convert the Series to a Dataframe with desired shape of the output filled with S values.
#Join df_S to df to get As and Bs
df_S = pd.DataFrame(index=np.repeat(S.index,3), columns=['S'], data= np.tile(S.values,3))
df_S.join(df)
Out[54]:
S A B
0 x 1 a
0 y 1 a
0 z 1 a
1 x 2 b
1 y 2 b
1 z 2 b
2 x 3 c
2 y 3 c
2 z 3 c
pd.DataFrame(np.repeat(...))
的解决方案上工作,但你更快;) - MaxU - stand with Ukraine