Pandas:如何为系列中的每个值重复数据框?

6

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

我该如何实现这种输出?我考虑过合并或连接,但合并会导致内存错误。我正在处理一个相当大的数据帧和序列。谢谢!

3个回答

13
使用numpy,假设你有不同长度的序列和数据帧。
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

是的,我也在基于pd.DataFrame(np.repeat(...))的解决方案上工作,但你更快;) - MaxU - stand with Ukraine
1
如果我说这种情况经常发生在我身上,你会感觉好些吗? :) - Vaishali
1
@Praneetha,你可以说n = len(s),然后在我的答案中使用n代替3。 - Vaishali
我刚测试过,但遇到了内存错误。有没有一种分块的方法来执行它?谢谢! - Praneetha
是的,问题出在内存超载上。分块处理会是一个更好的想法。但我不确定该如何做。 - Praneetha
显示剩余4条评论

4

更新:

这里是稍作更改的@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

我的期望输出不是这样的。我希望输出将初始数据框针对系列中的每个值进行重复。 - Praneetha
我知道这些示例都是长度为3,但如果我正确理解 OP 的话,它可能是 len(df)。 - Zeugma
长度可能相同也可能不同。我应该提到的。 - Praneetha
1
@Praneetha,请你发布一个可复现的数据集和一个期望的数据集? - MaxU - stand with Ukraine

0

设置

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接