【问题标题】:Adding new column based similar to a sql operation in python pandas在 python pandas 中添加类似于 sql 操作的新列
【发布时间】:2017-02-27 18:16:43
【问题描述】:

sql操作如下:

   UPDATE table_A s SET t.stat_fips=s.stat_fips
   WHERE t.stat_code=s.stat_code;

如果需要对 csv A 进行类似的操作,比较来自 csv B 的一些值如何在 Python 中实现?

数据: 让我们假设 -

CSV A
col1 stat_code 名称
ABC WY ABC
定义 NA 定义
GHI AZ GHI

CSV B
stat_fips stat_code
第2234章
4344 不适用
4588 亚利桑那州


生成的 CSV :

col1 stat_code 名称 stat_fips
ABC WY ABC 2234
定义 NA 定义 4344
ghi AZ GHI 4588

到目前为止添加尝试的代码:

    df = pd.read_csv('fin.csv',sep='\t', quotechar="'") 
    df = df.set_index('col1').stack(dropna=False).reset_index
    df1['stat_fips'] = df1['stat_code'] 
    print df1

(对 pandas 不太确定。学习基础知识)

【问题讨论】:

  • df = pd.read_csv('fin.csv',sep='\t', quotechar="'") df = df.set_index('col1').stack(dropna=False) .reset_index() df1['stat_fips'] = df1['stat_code'] 打印df

标签: python sql csv pandas


【解决方案1】:

判断您的示例数据,这看起来像您的 stat_code 列上的合并操作:

import pandas as pd

df_a = pd.DataFrame([["abc", "WY", "ABC"], ["def", "NA", "DEF"]], columns= ["col1", "stat_code", "name"])
df_b = pd.DataFrame([[2234, "WY"], [4344, "NA"]], columns=["stat_fips", "stat_code"])

merged_df = pd.merge(df_a, df_b, on="stat_code", how="left")
print(merged_df)

  col1 stat_code name  stat_fips
0  abc        WY  ABC       2234
1  def        NA  DEF       4344

【讨论】:

  • 如何确保 stat_fips 仍然是 int 而不是 string?
  • 合并不会将您的 stat_fips 从 int 更改为 string,因此您无需担心这一点。在合并发生之前,您可能已经有 stat_fips 的字符串。
  • 虽然它显示为 str 类型!.. 我需要对 csv 中生成的新列进行 int 操作,但它失败了。
  • 对,这可能是因为当通过pd.read_csv 加载数据时,stat_fips 列可能没有正确输入。在应用 int 操作之前,尝试通过 merged_df["stat_fips"] = merged_df["stat_fips"].astype(int) 将您的 stat_fips 列转换为整数。
  • @viv 看看here - 你应该在那里找到你需要的东西。
【解决方案2】:

看来你需要map by dict d:

d = df2.set_index('stat_code')['stat_fips'].to_dict()
df1['stat_fips'] = df1['stat_code'].map(d)
print (df1)

  col1 stat_code name  stat_fips
0  abc        WY  ABC       2234
1  def       NaN  DEF       4344
2  ghi        AZ  GHI       4588

merge 左连接:

df3 = pd.merge(df1, df2, on='stat_code', how='left')
print (df3)

  col1 stat_code name  stat_fips
0  abc        WY  ABC       2234
1  def       NaN  DEF       4344
2  ghi        AZ  GHI       4588

【讨论】:

  • 如何将最后一列的类型改为int而不是string?
  • 使用df3. stat_fips = df3. stat_fips.astype(int)
  • ValueError: 无法将 NA 转换为整数,如果我尝试查看该列的类型,则之前的命令是 str。我很确定
  • 有些NaN的值有问题,所以先把NaN换成一些标量df3.stat_fips = df3. stat_fips.fillna(0).astype(int)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-03-27
  • 2013-09-27
  • 1970-01-01
  • 2012-09-05
  • 1970-01-01
  • 2018-05-20
相关资源
最近更新 更多