【问题标题】:assign values of one dataframe column to another dataframe column based on condition根据条件将一个数据框列的值分配给另一个数据框列
【发布时间】:2021-11-17 20:12:22
【问题描述】:

我正在尝试根据不同的列比较两个数据帧,并根据它为数据帧分配一个值。

df1:

date    value1  value2
4/1/2021    A   1
4/2/2021    B   2
4/6/2021    C   3
4/4/2021    D   4
4/5/2021    E   5
4/6/2021    F   6
4/2/2021    G   7

df2:

Date    percent
4/1/2021    0.1
4/2/2021    0.2
4/6/2021    0.6

输出:

date    value1  value2  per
4/1/2021    A   1       0.1
4/2/2021    B   2       0.2
4/6/2021    C   3       0.6
4/4/2021    D   4       0
4/5/2021    E   5       0
4/6/2021    F   6       0
4/2/2021    G   7       0.2

代码1:

df1['per'] = np.where(df1['date']==df2['Date'], df2['per'], 0)

错误:

ValueError: Can only compare identically-labeled Series objects

注意:将 df2['Date] 的列值更改为 df2['date] 然后尝试合并 代码2:

new = pd.merge(df1, df2, on=['date'], how='inner')

错误:

ValueError: You are trying to merge on object and datetime64[ns] columns. If you wish to proceed you should use pd.concat

【问题讨论】:

  • 合并可能是最好的方法。你可能想有how='left' 的想法。该错误是因为您的日期列是不同的数据类型,一种是对象(可能是字符串),另一种是日期时间。如果您转换其中一列以匹配另一列,(使它们都是对象或都日期时间)合并应该工作

标签: python pandas dataframe


【解决方案1】:
df1['per']=df1['date'].map(dict(zip(df2['Date'], df2['percent']))).fillna(0)



      date value1  value2  per
0  4/1/2021      A       1  0.1
1  4/2/2021      B       2  0.2
2  4/6/2021      C       3  0.6
3  4/4/2021      D       4  0.0
4  4/5/2021      E       5  0.0
5  4/6/2021      F       6  0.6
6  4/2/2021      G       7  0.2

【讨论】:

    【解决方案2】:

    您可以使用pd.merge 并执行left 连接以保留df1 中的所有行,并从df2 中引入所有日期匹配行:

    pd.merge(df1,df2,left_on='date',right_on='Date', how='left').fillna(0).drop('Date',axis=1)
    

    打印:

             date value1  value2  percent
    0  04/01/2021      A       1      0.1
    1  04/02/2021      B       2      0.2
    2  04/06/2021      C       3      0.6
    3  04/04/2021      D       4      0.0
    4  04/05/2021      E       5      0.0
    5  04/06/2021      F       6      0.6
    6  04/02/2021      G       7      0.2
    

    *我认为你的倒数第二行有错字。 percent 应该是 0.6 IIUC。

    【讨论】:

      猜你喜欢
      • 2021-10-21
      • 2019-10-14
      • 1970-01-01
      • 2020-05-23
      • 1970-01-01
      • 2022-10-14
      • 2020-01-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多