如何跨多个数据集管理查找

2024-09-29 17:22:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我刚接触大数据,正在尝试将一些CSV查找复制到Pandas代码中。在较小的数据集上,我可以不使用嵌套循环。你知道吗

CSV中的查找是这样的:它们遍历datasheet1中的所有行,匹配datasheet2中的两个字段,如果存在匹配项,则设置datasheet1行的值:

=IFERROR(
    IF(
        ISBLANK(
            INDEX(RefTable!$D:$D,MATCH($E6,RefTable!$A:$A,0))
        ),
        "",                                                                                 
        INDEX(RefTable!$D:$D,MATCH($E6,RefTable!$A:$A,0))
    ),
    ""
)

当我尝试在Pandas中执行此操作时,结果是O(n^2)操作,它变得非常慢。例如,查找特定行的匹配城市,然后设置状态:

# total loops: 1000x100 = 100,000
for i, row in dataframe1.iterrows(): # 1000 rows
    for j, row2 in dataframe2.iterrows(): # 100 rows
       if row['market_city'] == row2['city']:
                dataframe1.loc[i, 'state'] = row2['state']

我怎样才能把它分解成更易于管理的东西,比如O(n)?你知道吗


Tags: csv数据inpandasforindexmatchrows
2条回答

您应该能够使用merge。没有在这台机器上安装python进行测试,但是类似于:

df3 = dataframe1.merge(dataframe2, 
                       left_on = 'market_city', 
                       right_on = 'city', 
                       how='left').drop(['state_x', 'city'], axis=1)

上面的代码将创建一个新的dataframe,它与dataframe1相同,但是当market\u city与city匹配时,它的状态来自dataframe2。如果这仍然不够快,join()可能会更快。你知道吗

值得注意的是,在索引上连接速度更快,因此可以按以下方式设置索引:

dataframe1.set_index('market_city', inplace=True)
dataframe2.set_index('city', inplace=True)

哇,这个问题很有趣,有时优化代码也很有趣。你知道吗

我试了几行,没有使用for循环就得到了结果。你知道吗

我已经创建了两个数据集,正如你的问题中提到的

df1 = pd.DataFrame({"market_city":["AM","CM","BM","EM","DM"],
                    "state":["ROM","AOM","SOM","DOM","VOM"]})
print(df1)
  market_city state
0          AM   ROM
1          CM   AOM
2          BM   SOM
3          EM   DOM
4          DM   VOM

df2 = pd.DataFrame({"city":["CM","KM","AM"],"state":["ZOM","TOM","KOM"]})
print(df2)
  city state
0   CM   ZOM
1   KM   TOM
2   AM   KOM

现在,我们有两个数据帧,在这里我们用df2状态替换df1状态,在这里我们看到了df1市场城市和df2城市之间的匹配

代码

dct_val = dict(zip(df2['city'], df2.state))
df1['state'] = df1['market_city'].replace(dct_val)

print(df1)
  market_city state
0          AM   KOM
1          CM   ZOM
2          BM    BM
3          EM    EM
4          DM    DM

相关问题 更多 >

    热门问题