【问题标题】:Merge csv files by columns按列合并 csv 文件
【发布时间】:2021-12-07 00:15:39
【问题描述】:

嘿,我正在使用 python3,我想按列合并两个 csv 文件,我做得对,但我希望合并只会在数字后的两位数字上显示并按此合并。

例如,如果我有这两个 csv

df1:
X1     Y1     Z1
1.232  2.271  6
3.527  5.628  7

df2:
X2     Y2     Z2
1.231  2.275  6
3.526  5.624  7

当前的解决方案不会按 X 和 Y 列合并,因为数字后面的第三位数字不同,我希望合并命令只查看数字后面的两位数字并按它们合并。

这是我目前的解决方案:

from pandas import merge    
df1 = merge(df1, df2, left_on=['X1', 'Y1'], right_on=['X2', 'Y2'])

所以从这个解决方案中,两个数据框不会合并,我希望它们被合并并忽略数字后面的第三个数字。

【问题讨论】:

    标签: python-3.x pandas dataframe csv merge


    【解决方案1】:

    使用np.floor 截取2 位数字后的值:

    df1 = pd.merge(df1.assign(x11 = np.floor(df1['X1'], 2),
                              y11 = np.floor(df1['Y1'], 2)), 
                   df2.assign(x22 = np.floor(df1['X2'], 2),
                              y22 = np.floor(df1['Y2'], 2)), left_on=['x11', 'y11'], right_on=['x22', 'y22']
    

    如果可能,或者使用Series.round(值是四舍五入的,而不是截断的):

    df1 = pd.merge(df1.assign(x11 = df1['X1'].round(2),
                              y11 = df1['Y1'].round(2)), 
                   df2.assign(x22 = df1['X2'].round(2),
                              y22 = df1['Y2'].round(2)), left_on=['x11', 'y11'], right_on=['x22', 'y22'])
    

    或者使用多个 100 进行欺骗并转换为整数以获得切割值:

    df1 = pd.merge(df1.assign(x11 = df1['X1'].mul(100).astype(int),
                              y11 = df1['Y1'].mul(100).astype(int)), 
                   df2.assign(x22 = df1['X2'].mul(100).astype(int)),
                              y22 = df1['Y2'].mul(100).astype(int)), left_on=['x11', 'y11'], right_on=['x22', 'y22'])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-25
      • 2021-03-08
      • 2018-03-09
      • 2019-11-06
      • 1970-01-01
      • 2018-03-30
      • 2018-10-31
      • 1970-01-01
      相关资源
      最近更新 更多