【问题标题】:Substituting column value if particular column exists in two DataFrames with Pandas如果特定列存在于带有 Pandas 的两个 DataFrame 中,则替换列值
【发布时间】:2021-04-05 18:32:29
【问题描述】:

我有 2 个代表 CSV 文件的数据框:

# 1.csv

id,email
1,someone@email.com
2,someoneelse@email.com
...
# 2.csv

id,email
3,someone@otheremail.com
4,someone@email.com
...

我想要做的是使用Pandas 将两个表合并到一个DataFrame 中,这取决于特定列(在本例中为第2 列,email)在两个DataFrames 中是否相同。 我需要合并的 DataFrame 从2.csv 中选择id

例如,使用上面的示例数据,由于email列值someone@email.com在两个CSV中都存在,我需要合并的DataFrame输出以下内容:

# 3.csv
id,email
4,someone@gmail.com
2,someoneelse@email.com
3,someone@otheremail.com

我目前的情况如下:

df1 = pd.read_csv('/path/to/1.csv')

print("df1 has {} rows".format(len(df1.index)))
# "df1 has 14072 rows"

df2 = pd.read_csv('/path/to/2.csv')

print("df2 has {} rows".format(len(df2.index)))
# "df2 has 56766 rows"

join = pd.merge(df1, df2, on="email", how="inner")

print("join has {} rows".format(len(join.index)))
# "join has 321 rows" 

问题在于join DataFrame 仅生成两个 DataFrame 中存在email 字段的行。我期望的是输出 DataFrame 包含 56766 + 14072 - 321 = 70517 行,其中 id 值是来自 2.csv 的值,而 email 字段在两个源 DataFrames 中是相同的。我尝试更改merge(how="left|right"),但结果相同。

【问题讨论】:

  • 使用how='outer'
  • 还是和how='outer'一样...

标签: python pandas dataframe csv


【解决方案1】:
from datatable import dt, f, by

df1 = dt.Frame("""
id,email
1,someone@email.com
2,someoneelse@email.com
""")
df1['csv'] = 1

df2 = dt.Frame("""
id,email
3,someone@otheremail.com
4,someone@email.com
""")
df2['csv'] = 2


df_all = dt.rbind(df1, df2)

df_result = df_all[-1, ['id'], by('email')]

【讨论】:

  • 谢谢,在我的 Macbook 上安装 datatable 时遇到了一些问题。显然 Bi Sur 尚不支持它。
  • @KobbiGal,数据表在我的带有 Big Sur 的 MacBook 上运行良好。
【解决方案2】:

通过将文件上传到谷歌电子表格并使用VLOOKUP解决它

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-06-12
    • 1970-01-01
    • 2021-09-05
    • 2017-08-14
    • 2014-09-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多