我正在寻找从一个数据框中获取值,然后根据索引将它们附加到另一个数据框中,并快速实现它。可以说我们有以下两个数据帧:
df
有一堆带有城市作为列标题的随机数
df2
是一个充满以(不重要)字母为标题的城市的数据框
在df2
的{{1}}位置,我们有df.loc[0,'c']
。然后,我想转到Los Angeles
并找到df
列,并从Los Angeles
索引中获取值,并将其附加到0
上,使其读为{{1} }
df2
预期结果:
df3
Los Angeles : 544
我通过执行double for循环解决了此问题,但由于我的数据帧为(280k,260),因此花费了太长时间,因此我必须执行两次此功能。我正在寻找一种方法在numpy中做到这一点。理想情况下,如果我可以创建一个新的numpy数组,在其中它的数字在正确的索引位置中为字符串,并且我可以使用import pandas as pd
import numpy as np
np.random.seed(42)
letters = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i']
cities = ['Minneapolis', 'Boston', 'Chicago', 'San Francisco', 'Los Angeles', 'Bozeman', 'New York', 'Austin',
'Dallas', 'New Orleans']
df = pd.DataFrame({city:np.random.randint(1, 1000, 10000) for city in cities})
df = df.astype(str)
df2 = pd.DataFrame({k:[np.random.choice(cities) for i in range(10000)] for k in letters})
df
Minneapolis Boston Chicago San Francisco Los Angeles
0 103 720 444 335 544
1 436 833 813 252 418
2 861 140 428 919 339
3 271 792 83 804 801
4 107 546 765 825 320
df2
a b c d e
0 San Francisco Minneapolis Los Angeles Chicago Los Angeles
1 Minneapolis San Francisco Los Angeles Chicago San Francisco
2 Minneapolis Los Angeles Boston Chicago Boston
3 Chicago Chicago Chicago Boston Los Angeles
4 San Francisco San Francisco San Francisco Boston Los Angeles
来将矩阵式单词和数字加在一起。只是想找出一种索引这些值的快速方法。
a b c \
0 San Francisco : 335 Minneapolis : 103 Los Angeles : 544
1 Minneapolis : 436 San Francisco : 252 Los Angeles : 418
2 Minneapolis : 861 Los Angeles : 339 Boston : 140
3 Chicago : 83 Chicago : 83 Chicago : 83
4 San Francisco : 825 San Francisco : 825 San Francisco : 825
答案 0 :(得分:2)
您可以使用lookup
:
s = df2.stack().reset_index(name='val');
df2 + ' : ' + df.lookup(s['level_0'], s['val']).reshape(df2.shape)
在10000行数据上的执行时间为:
44 ms ± 1.41 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
截断数据的输出:
a b c \
0 San Francisco : 335 Minneapolis : 103 Los Angeles : 544
1 Minneapolis : 436 San Francisco : 252 Los Angeles : 418
2 Minneapolis : 861 Los Angeles : 339 Boston : 140
3 Chicago : 83 Chicago : 83 Chicago : 83
4 San Francisco : 825 San Francisco : 825 San Francisco : 825
d e
0 Chicago : 444 Los Angeles : 544
1 Chicago : 813 San Francisco : 252
2 Chicago : 428 Boston : 140
3 Boston : 792 Los Angeles : 801
4 Boston : 546 Los Angeles : 320