Pandas 获得与 SQL 语句相同结果的 Pythonic 方式是啥:“UPDATE-LEFT JOIN - SET - WHERE”?
Posted
技术标签:
【中文标题】Pandas 获得与 SQL 语句相同结果的 Pythonic 方式是啥:“UPDATE-LEFT JOIN - SET - WHERE”?【英文标题】:Which is the Pythonic way for Pandas to obtain the same result as an SQL statement: "UPDATE- LEFT JOIN - SET - WHERE"?Pandas 获得与 SQL 语句相同结果的 Pythonic 方式是什么:“UPDATE-LEFT JOIN - SET - WHERE”? 【发布时间】:2019-10-02 00:11:38 【问题描述】:我想在 Pandas 中复制以下 SQL 结构“更新 dataframe1 LEFT JON dataframe2 SET dataframe1.column1 = dataframe2.column2 WHERE dataframe1.column3 > X”
我知道可以合并数据框,然后使用 ".where" 处理合并的列
但是,它似乎不是一个简单的解决方案。
df = pd.merge(df1,df2, suffix(a,b))
df['clmn1'] = df['clmn1_b'].where( df[clmn1]>0, df['clmn1_b'])
有没有更好的方法来达到目标? 谢谢
【问题讨论】:
你是加入一个特定的索引,还是加入几个重叠的列? 我认为map
在这里工作,或者 set_index()
我的想法和 WeNYoBen 一样。 map
和 replace
都可以使用
@AndyHayden 我指的是采用通用方法,有时有索引,在其他情况下没有索引。对于一般情况,假设您有一个包含客户名称和国家/地区的列,“客户列表”:[Name, Gender, country] 和字段列表:[[Jack, M, USA], [Nick, M, UK], [Alphio, F, RU], [Jenny, F, USA]] 那么你有另一个带有“缩写”的表:[USA: United States, UK, United Kingdom, etc..] .. 我的用例在当性别为男性(M)时,要更新表“客户列表”,将缩写替换为长国名。
@WeNYoBen 你会如何结合合并和映射?
【参考方案1】:
使用 cmets 中的示例:
In [21]: df
Out[21]:
Name Gender country
0 Jack M USA
1 Nick M UK
2 Alphio F RU
3 Jenny F USA
In [22]: country_map = 'USA': 'United States', 'UK': 'United Kingdom', 'RU': 'Russia'
In [23]: df.country.map(country_map)
Out[23]:
0 United States
1 United Kingdom
2 Russia
3 United States
Name: country, dtype: object
要仅更新 M 行,您可以使用 loc 和 update:
In [24]: df.country.update(df[df.Gender == 'M'].country.map(country_map))
In [25]: df
Out[25]:
Name Gender country
0 Jack M United States
1 Nick M United Kingdom
2 Alphio F RU
3 Jenny F USA
【讨论】:
以上是关于Pandas 获得与 SQL 语句相同结果的 Pythonic 方式是啥:“UPDATE-LEFT JOIN - SET - WHERE”?的主要内容,如果未能解决你的问题,请参考以下文章
MySQL CASE 语句在 Workbench 和 Angular 中返回不同的结果