gpt4 book ai didi

python - Pandas:从其他数据帧更新数据帧列

转载 作者:行者123 更新时间:2023-12-01 09:27:03 24 4
gpt4 key购买 nike

我在更新组合来自其他数据帧的数据的列上的日期时间值时遇到问题。第一个df包含汽车租赁公司的汽车数据:

df_cars = pd.DataFrame([['1708092730', 'MERC', 'GLK270', 'PLT01', '', ''],
['T170900224', 'MERC', 'C200', 'PLT02', '', ''],
['1708092733', 'BMW', 'Χ3', 'PLT03', '', ''],
['T170902781', 'BMW', 'X6', 'PLT04', '', ''],
['T171002176', 'VW', 'PASSAT', 'PLT05', '', ''],
['1708090817', 'FORD', 'MUSTANG', 'PLT06', '', '']],
columns=['RefNo', 'Brand', 'Model', 'Plate', 'Driver', 'Date'])

第二个 df 由车库出站记录组成:

df_out = pd.DataFrame([['1708092733', 'John', '2018-1-2', 'MC', 250],
['T170900224', 'Phil', '2018-1-15', 'AMEX', 400],
['T170902781', 'Ann', '2018-1-22', 'VI', 400],
['1708092730', 'Ann', '2018-1-28', 'AMEX', 200],
['1708092733', 'Jeff', '2018-2-1', 'VI', 200]],
columns=['RefNo', 'Driver', 'Date', 'Payment', 'Deposit'])

第三个 df 包括车库入站记录:

df_in = pd.DataFrame([['1708092733', '2018-1-18', 165],
['T170902781', '2018-2-12', 600],
['1708092730', '2018-2-15', 150]],
columns=['RefNo', 'Date', 'Ammount'])

RefNo 是车 key 上的独特条形码。我正在尝试更新 df_cars 列:

  • “司机”,其中包含最后租用汽车的司机的姓名(以防车辆离开车库),并且
  • “日期”,即汽车状态更改的最后日期(“出库”或“库内”)

以下更新代码对于少量行可以正常工作

df_OutIn = pd.concat([df_out, df_in])                           # concatenate Garage out & in entries
df_OutIn['Date'] = pd.to_datetime(df_OutIn.Date) # OutIn df Date column to datetile format
df_OutIn = df_OutIn.sort_values(by='Date') # sort OutIn df by Date
df_OutIn = df_OutIn.drop_duplicates(['RefNo'], keep='last') # remove duplicates and keep last update per car

df_tmp = df_cars[['RefNo', 'Driver']].set_index('RefNo') # Update 'Driver' in df_cars
df_tmp.update(df_OutIn.set_index('RefNo'))
df_cars['Driver'] = df_tmp.values

df_tmp = df_cars[['RefNo', 'Date']].set_index('RefNo') # Update 'Date' in df_cars
df_tmp.update(df_OutIn.set_index('RefNo'))
df_cars['Date'] = df_tmp.values
df_cars['Date'] = pd.to_datetime(df_cars.Date)

df_cars 预计更新为

        RefNo Brand    Model  Plate Driver        Date
0 1708092730 MERC GLK270 PLT01 2018-02-15
1 T170900224 MERC C200 PLT02 Phil 2018-01-15
2 1708092733 BMW Χ3 PLT03 Jeff 2018-02-01
3 T170902781 BMW X6 PLT04 2018-02-12
4 T171002176 VW PASSAT PLT05 NaT
5 1708090817 FORD MUSTANG PLT06 NaT

处理整个数据集(25-30k 记录)时,我收到警告

A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

对于改进这部分代码有什么建议吗?预先感谢您!

最佳答案

删除重复项后的代码可以替换为。

df_cars = df_cars.merge(df_OutIn[["RefNo","Date","Driver"]],how="left",on="RefNo")

由于您的 df_cars 的“日期”和“驱动程序”有一个空列,因此合并将在列名称中添加后缀。要解决此问题,只需从 df_cars 中删除那些空列即可。

关于python - Pandas:从其他数据帧更新数据帧列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50300528/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com