如何复制pandas数据框以匹配其他数据框的长度?

3
假设有以下数据框:
df1:
a    
10.
20.
30.
40.
50.
60.
70.
80.
90.
100.
110.
120.

df2:

b
1.
2.

df3:

b
1.
2.
3.

了解len(df1.values) % len(df2.values) == 0之后,我想将df2重复多次以适应df1的长度,并将df1中的每个元素除以df2中的每个元素。

result(df1, df2):

a    
10.
10.
30.
20.
50.
30.
70.
40.
90.
50.
110.
60.

结果(df1, df3):

a    
10.
10.
10.
40.
25.
20.
70.
40.
30.
100.
55.
40.

最干净的方法是什么,最好不要通过numpy实现?


你为什么想要避免使用Numpy? - piRSquared
我的想法是,如果可以使用纯pandas完成这个任务,那么为什么要去使用numpy。 - Gulzar
1
  1. 如果你已经导入了 Pandas,那么你已经导入了 Numpy。
  2. 为了进行除法运算,你必须忽略原生的 Pandas 索引对象,因为它们不匹配。这意味着你需要除以一个 Numpy 数组或者一个有意构建的 Pandas.Series,在其中你需要使用一个 Numpy 数组填充。我的观点是,在这种情况下,使用简单的 Numpy 解决方案比使用复杂的解决方案要更优雅和高效,而试图避免使用 Numpy。
- piRSquared
2个回答

3
这里有一种使用np.resize的方法,新数组将会被原始数组复制填充直到达到指定长度。
df1['a'] /= np.resize(df2.b.values, df1.shape[0])

      a
0    10.0
1    10.0
2    30.0
3    20.0
4    50.0
5    30.0
6    70.0
7    40.0
8    90.0
9    50.0
10  110.0
11   60.0

或者使用pd.np.tile函数:

df1['a'] /= pd.np.tile(df2.b, df1.shape[0]//df2.shape[0])

3
从OP的话中可以得知,"Knowing len(df1.values) % len(df2.values) == 0",需要翻译成中文。这句话的意思是:了解df1.values的长度是否为df2.values长度的倍数。 - piRSquared
1
似乎使用np.resize工作正常 @QuangHoang - yatu
1
pd.np是与import numpy as np相同的numpy。因此,在导入pandas后导入Numpy,你不需要再进行任何额外的操作,因为它已经被导入了。在导入Pandas之后导入Numpy并没有额外的开销。请不要以为不导入Numpy可以节省时间或内存。你只能节省19个字符。 - piRSquared
感谢您的想法@piRSquared :) 我并没有假设,只是基于OP想要避免使用numpy这一事实,对于其他方面我完全同意。 - yatu
2
我明白。我在OP的问题上写了一条同样愤怒的老年人评论 (-: - piRSquared
显示剩余2条评论

2
最初的回答

我会做

n=len(df1)//len(df2)
df1.a/np.tile(df2.b,n+1)[:len(df1)]
Out[871]: 
0      10.0
1      10.0
2      30.0
3      20.0
4      50.0
5      30.0
6      70.0
7      40.0
8      90.0
9      50.0
10    110.0
11     60.0
Name: a, dtype: float64

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