gpt4 book ai didi

python - 使用来自另一个多索引数据帧的 .loc 填充数据帧值的最快方法

转载 作者:行者123 更新时间:2023-12-01 01:57:06 25 4
gpt4 key购买 nike

我有一个数据框df1:

key1    key2   val
1 100
2 500
4 400

我还有一个多索引数据框df2:

       c
a b
1 100 a
2 200 b
3 300 j
4 400 e
5 500 t

我想从多索引数据帧 df2 中填充 df1 的 val

我尝试过:

for index,row in df1.iterrows():
try:
data = df2.loc([row['key1'],row['key2'])
df1.loc[(df1.key1 == row['key1']) & (df1.key2 == row['key2']), 'val'] = data
except:
pass

最后,我的 df1 应该如下所示:

key1    key2   val
1 100 a
2 500
4 400 e

但我主要担心的是 df2(多索引 df)的实际长度将在 60-7 万行左右。

df1 的长度几乎不会是 10 行。(我想重复这个过程,获取包含其他数据的 df1)

那么这个使用 for 循环的 .loc 可以工作吗?它是最快的吗?

或者使用.apply会更快?

我希望这次迭代是最快的。

有任何关于以尽可能最快的方式运行此操作的线索吗?

最佳答案

在pandas中最好避免循环 - iterrowsapply(引擎盖下的循环),更好的是矢量化解决方案。

使用join带参数on:

#for improve performance sort index and columns
df2 = df2.sort_index()
df1 = df1.sort_values(['key1','key2'])

df = df1.join(df2, on=['key1','key2'])
print (df)
key1 key2 val c
0 1 100 NaN a
1 2 500 NaN NaN
2 4 400 NaN e

编辑:

另一种方法是连接 MultiIndex 和列值并使用 map :

df2.index = ['{}_{}'.format(a,b) for a, b in df2.index]
print (df2)
c
1_100 a
2_200 b
3_300 j
4_400 e
5_500 t

df1['joined'] = df1['key1'].astype(str) + '_' + df1['key2'].astype(str)
print (df1)
key1 key2 val joined
0 1 100 NaN 1_100
1 2 500 NaN 2_500
2 4 400 NaN 4_400

df1['col'] = df1['joined'].map(df2['c'])
print (df1)
key1 key2 val joined col
0 1 100 NaN 1_100 a
1 2 500 NaN 2_500 NaN
2 4 400 NaN 4_400 e

时间:

np.random.seed(123)
N = 100000
df2 = pd.DataFrame(np.random.randint(10000, size=(N, 3)), columns=list('abc'))
df2 = df2.drop_duplicates(['a','b']).set_index(['a','b'])
print (df2.head())
c
a b
3582 1346 5218
7763 9785 7382
5857 96 6257
6782 4143 4169
5664 942 6368

df1 = df2.iloc[np.random.randint(N, size=10)].reset_index()
df1.columns = ['key1','key2','val']
print (df1)
key1 key2 val
0 5157 9207 283
1 6452 6474 7092
2 1264 5009 5123
3 86 7225 1025
4 7787 5134 637
5 9406 6119 8719
6 7479 1493 1525
7 4098 7248 7618
8 9921 7925 8547
9 2320 764 1564

1.加入未排序的MultiIndex,列:

In [42]: %timeit df1.join(df2, on=['key1','key2'])
100 loops, best of 3: 11.1 ms per loop

2.然后先排序再join(计时时不使用排序):

df2 = df2.sort_index()

In [44]: %timeit df1.join(df2, on=['key1','key2'])
100 loops, best of 3: 10.5 ms per loop

3.map解决方案,还加入MultiIndex不计入计时,如果仍然相同的数据只运行一次:

df2.index = ['{}_{}'.format(a,b) for a, b in df2.index]
df1['joined'] = df1['key1'].astype(str) + '_' + df1['key2'].astype(str)

In [51]: %timeit df1['col'] = df1['joined'].map(df2['c'])
1000 loops, best of 3: 371 µs per loop
<小时/>
In [55]: %%timeit
...: df1['joined'] = df1['key1'].astype(str) + '_' + df1['key2'].astype(str)
...: df1['col'] = df1['joined'].map(df2['c'])
...:
1000 loops, best of 3: 1.08 ms per loop

关于python - 使用来自另一个多索引数据帧的 .loc 填充数据帧值的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50035426/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com