请看下面的Python Pandas DataFrame:

ID country money code money_add other time
832932 Other NaN 00000 NaN [N2,N2,N4] 0 days 01:37:00
217#8# NaN NaN NaN NaN [N1,N2,N3] 2 days 01:01:00
1329T2 France 12131 00020 3452 [N1,N1] 1 days 03:55:00
124932 France NaN 00016 NaN [N2] 0 days 01:28:00
194022 France NaN 00000 NaN [N4,N3] 3 days 02:35:00

如果code列不是NaN,而money列是NaN,我们将更新下表中的值moneymoney_add.使用codecod_t列作为键.

cod_t money money_add
00000 4532 72323
00016 1213 23822
00030 1313 8393
00020 1813 27328

生成的表示例:

ID country money code money_add other time
832932 Other 4532 00000 72323 [N2,N2,N4] 0 days 01:37:00
217#8# NaN NaN NaN NaN [N1,N2,N3] 2 days 01:01:00
1329T2 France 12131 00020 3452 [N1,N1] 1 days 03:55:00
124932 France 1213 00016 23822 [N2] 0 days 01:28:00
194022 France 4532 00000 72323 [N4,N3] 3 days 02:35:00

User@jezrael为我提供了以下问题解决方案:

df1 = df1.drop_duplicates('cod_t').set_index('cod_t')
df = df.set_index(df['code'])
df.update(df1, overwrite=False)
df = df.reset_index(drop=True).reindex(df.columns, axis=1)

但是这段代码给了我一个我不知道如何解决的错误:

TypeError: The DType <class 'numpy.dtype[timedelta64]'> could not be promoted by <class
'numpy.dtype[float64]'>. This means that no common DType exists for the given inputs. 
For example they cannot be stored in a single array unless the dtype is `object`. 
The full list of DTypes is: (<class 'numpy.dtype[timedelta64]'>, <class 'numpy.dtype[float64]'>)
// First DataFrame dtypes
ID                                 object
country                            object
code                               object
money                             float64
money_add                         float64
other                              object
time                      timedelta64[ns]
dtype: object
// Second DataFrame dtypes
cod_t                     object
money                      int64
money_add                  int64
dtype: object

如果你能帮我解决这个错误,或者建议使用update以外的其他方法,我将不胜感激.

推荐答案

因为DataFrame.update不能很好地工作,所以这里是另一种 Select --首先对来自第二个DataFrame的新列使用左联接,再使用DataFrame.merge:

df2 = df.merge(df1.drop_duplicates('cod_t').rename(columns={'cod_t':'code'}), 
               on='code', 
               how='left',
               suffixes=('','_'))

print (df2)
       ID country    money  code  money_add         other            time  \
0  832932   Other      NaN   0.0        NaN  [N2, N2, N4] 0 days 01:37:00   
1  217#8#     NaN      NaN   NaN        NaN  [N1, N2, N3] 2 days 01:01:00   
2  1329T2  France  12131.0  20.0     3452.0      [N1, N1] 1 days 03:55:00   
3  124932  France      NaN  16.0        NaN          [N2] 0 days 01:28:00   
4  194022  France      NaN   0.0        NaN      [N4, N3] 3 days 02:35:00   

   money_  money_add_  
0  4532.0     72323.0  
1     NaN         NaN  
2  1813.0     27328.0  
3  1213.0     23822.0  
4  4532.0     72323.0 

然后获取带/不带_的列名:

cols_with_ = df2.columns[df2.columns.str.endswith('_')]
cols_without_ = cols_with_.str.rstrip('_')

print (cols_with_)
Index(['money_', 'money_add_'], dtype='object')

print (cols_without_)
Index(['money', 'money_add'], dtype='object')

传递到DataFrame.combine_first,最后删除帮助器列:

df2[cols_without_] = (df2[cols_without_].combine_first(df2[cols_with_]
                                        .rename(columns=lambda x: x.rstrip('_'))))
df2 = df2.drop(cols_with_, axis=1)
print (df2)
       ID country    money  code  money_add         other            time
0  832932   Other   4532.0   0.0    72323.0  [N2, N2, N4] 0 days 01:37:00
1  217#8#     NaN      NaN   NaN        NaN  [N1, N2, N3] 2 days 01:01:00
2  1329T2  France  12131.0  20.0     3452.0      [N1, N1] 1 days 03:55:00
3  124932  France   1213.0  16.0    23822.0          [N2] 0 days 01:28:00
4  194022  France   4532.0   0.0    72323.0      [N4, N3] 3 days 02:35:00

Python相关问答推荐

Deliveryter Notebook -无法在for循环中更新matplotlib情节(保留之前的情节),也无法使用动画子功能对情节进行动画

沿着数组中的轴计算真实条目

如何在Windows上用Python提取名称中带有逗号的文件?

avxspan与pandas period_range

如果值发生变化,则列上的极性累积和

创建可序列化数据模型的最佳方法

如何使用scipy的curve_fit与约束,其中拟合的曲线总是在观测值之下?

如何指定列数据类型

我的字符串搜索算法的平均时间复杂度和最坏时间复杂度是多少?

* 动态地 * 修饰Python中的递归函数

如何在Pyplot表中舍入值

使用Python从rotowire中抓取MLB每日阵容

处理Gekko的非最优解

我可以不带视频系统的pygame,只用于游戏手柄输入吗?''

每次查询的流通股数量

为什么在Python中00是一个有效的整数?

多索引数据帧到标准索引DF

为什么在不先将包作为模块导入的情况下相对导入不起作用

使用pytest测试是否缺少导入

使代码更快地解决哪个字母代表给定公式中的哪个数字