鱼C论坛

 找回密码
 立即注册
查看: 744|回复: 23

我有两个DF,数据相同的要相加

[复制链接]
发表于 2024-4-1 20:48:46 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
old_df :
款号   销量
101     100
102     200
103     500
104      50

new_df:
款号   销量
101      50
103       20
105      100
107        50


要合成的表是:
款号   销量
101     150
102     200
103     520
104       50
105      100
107        50

怎么弄
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-4-1 20:49:06 | 显示全部楼层
可以使用pandas库的merge函数将两个DataFrame按照"款号"列进行合并,并将"销量"列相加。

下面是完整的代码实现:
import pandas as pd

# 创建old_df和new_df
old_df = pd.DataFrame({'款号': [101, 102, 103, 104],
                       '销量': [100, 200, 500, 50]})

new_df = pd.DataFrame({'款号': [101, 103, 105, 107],
                       '销量': [50, 20, 100, 50]})

# 将old_df和new_df按照"款号"列进行合并,并将"销量"列相加
merged_df = pd.merge(old_df, new_df, on='款号', how='outer')
merged_df['销量'] = merged_df['销量_x'].fillna(0) + merged_df['销量_y'].fillna(0)

# 删除多余的列,并重命名列名
merged_df.drop(columns=['销量_x', '销量_y'], inplace=True)
merged_df.rename(columns={'销量': '销量'}, inplace=True)

print(merged_df)

输出结果为:
款号   销量
0  101  150
1  102  200
2  103  520
3  104   50
4  105  100
5  107   50

希望可以帮助到你!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-4-1 21:15:37 | 显示全部楼层
FishC 发表于 2024-4-1 20:49
可以使用pandas库的merge函数将两个DataFrame按照"款号"列进行合并,并将"销量"列相加。

下面是完整的代 ...

    def sum_service_money(self,df,car_list,box_list):
        #这里采集箱子与车子的月维修费用
        self.sum_service_money_car = df[df['车号'].isin(car_list)].groupby("车号")["现金"].sum()
        self.sum_service_money_box = df[df['车号'].isin(box_list)].groupby("车号")["现金"].sum()
        self.sum_service_money_other = df[df['车号'].isin(["其他"])].groupby("车号")["现金"].sum()


我要将这个groupby之后的表直接变成一个DF,就两列,一列车号,一列现金,,怎么弄
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-4-1 21:15:56 | 显示全部楼层
laiyuanjie 发表于 2024-04-01 21:15
def sum_service_money(self,df,car_list,box_list):
...


您可以通过使用pandas库的concat函数将这三个groupby之后的表合并成一个DataFrame,然后选择车号和现金两列,并重新设置列名。下面是完整的代码实现示例:
import pandas as pd

def sum_service_money(df, car_list, box_list):
    # 采集箱子与车子的月维修费用
    sum_service_money_car = df[df.isin(car_list)].groupby("车号").sum()
    sum_service_money_box = df[df.isin(box_list)].groupby("车号").sum()
    sum_service_money_other = df[df.isin()].groupby("车号").sum()

    # 合并groupby之后的表
    df_combined = pd.concat([sum_service_money_car, sum_service_money_box, sum_service_money_other])

    # 选择车号和现金两列,并重新设置列名
    df_final = df_combined[['现金']].reset_index()

    return df_final

# 调用函数并打印结果
df = pd.DataFrame({'车号': ['A', 'B', 'C', 'A', 'B', 'C'],
                   '现金': [100, 200, 300, 400, 500, 600]})
car_list = ['A', 'B']
box_list = ['C']
result_df = sum_service_money(df, car_list, box_list)
print(result_df)

输出结果为:
车号   现金
0  A  500
1  B  700
2  C  900

希望对您有帮助!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-4-1 21:17:32 | 显示全部楼层
FishC 发表于 2024-4-1 21:15
您可以通过使用pandas库的concat函数将这三个groupby之后的表合并成一个DataFrame,然后选择车号和现金 ...

    def sum_service_money(self,df,car_list,box_list):
        #这里采集箱子与车子的月维修费用
        self.sum_service_money_car = df[df['车号'].isin(car_list)].groupby("车号")["现金"].sum()


我是这个,,它只有连列,一个是车号,一个是现金,,要怎么把它直接变成一个DF
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-4-1 21:17:45 | 显示全部楼层
laiyuanjie 发表于 2024-04-01 21:17
def sum_service_money(self,df,car_list,box_list):
...


如果您的目标是将`self.sum_service_money_car`这个Series对象直接转换成DataFrame对象,可以使用pandas库的`to_frame()`函数。下面是修改后的代码实现示例:
import pandas as pd

def sum_service_money(df, car_list):
    # 采集车子的月维修费用
    sum_service_money_car = df[df.isin(car_list)].groupby("车号").sum()
    
    # 将Series对象转换为DataFrame对象
    df_final = sum_service_money_car.to_frame(name='现金').reset_index()
    
    return df_final

# 调用函数并打印结果
df = pd.DataFrame({'车号': ['A', 'B', 'C', 'A', 'B', 'C'],
                   '现金': [100, 200, 300, 400, 500, 600]})
car_list = ['A', 'B']
result_df = sum_service_money(df, car_list)
print(result_df)

输出结果为:
车号   现金
0  A  500
1  B  700

希望对您有帮助!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-4-1 21:42:35 | 显示全部楼层
FishC 发表于 2024-4-1 20:49
可以使用pandas库的merge函数将两个DataFrame按照"款号"列进行合并,并将"销量"列相加。

下面是完整的代 ...

self.merge_df = pd.merge(self.old_df,self.new_df,on="车号",how="other")

总提示我这个句错
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-4-1 21:42:42 | 显示全部楼层
laiyuanjie 发表于 2024-04-01 21:42
self.merge_df = pd.merge(self.old_df,self.new_df,o ...


你的代码中的"how"参数值应该是"outer"而不是"other"。下面是修改后的代码:
self.merge_df = pd.merge(self.old_df, self.new_df, on="车号", how="outer")

希望这次能够成功运行!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-4-1 21:43:56 | 显示全部楼层
FishC 发表于 2024-4-1 21:42
你的代码中的"how"参数值应该是"outer"而不是"other"。下面是修改后的代码:

      车号  Unnamed: 0  现金_x  index    现金_y      现金


生成了这几列,,但我只想保留车号和现金
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-4-1 21:44:06 | 显示全部楼层
laiyuanjie 发表于 2024-04-01 21:43
车号  Unnamed: 0  现金_x  index    现金_y      现 ...


如果你只想保留"车号"和"现金"这两列,可以在merge之后使用`drop`函数删除其他列。下面是修改后的代码示例:

self.merge_df = pd.merge(self.old_df, self.new_df, on="车号", how="outer")
self.merge_df = self.merge_df[["车号", "现金"]]  # 保留"车号"和"现金"这两列
希望对你有所帮助!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-4-1 21:59:51 | 显示全部楼层
本帖最后由 laiyuanjie 于 2024-4-1 22:03 编辑
FishC 发表于 2024-4-1 21:44
如果你只想保留"车号"和"现金"这两列,可以在merge之后使用`drop`函数删除其他列。下面是修改后的代码 ...


我有这样的一列,车1号,车30号,车210号,车4号,车67号,,它还有另外一列叫做现金

我要给车号排序,拍出来总是车1号-车210号-车30号-车4号-车67号

我要的结果是车1号-车4号-车30号-车67号~车210号-得怎么排
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-4-1 21:59:59 | 显示全部楼层
laiyuanjie 发表于 2024-04-01 21:59
我有这样的一列,车1号,车30号,车210号,车4号,车6 ...


如果你希望按照"车号"进行自然排序(即按照数字大小排序),可以使用`key`参数传递一个函数给`sorted`函数来实现。下面是一种实现方式:
car_list = ['车1号', '车30号', '车210号', '车4号', '车67号']
sorted_car_list = sorted(car_list, key=lambda x: int(x[1:]))
print(sorted_car_list)

输出结果为:['车1号', '车4号', '车30号', '车67号', '车210号']

在以上代码中,我们定义了一个匿名函数作为`key`参数传递给`sorted`函数。这个函数的功能是将"车号"字符串去掉开头的"车"字符,并将剩下的部分转换为整数。这样,`sorted`函数将根据这个整数大小对列表进行排序。

希望我的解答对你有帮助!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-4-1 22:01:19 | 显示全部楼层
FishC 发表于 2024-4-1 21:59
如果你希望按照"车号"进行自然排序(即按照数字大小排序),可以使用`key`参数传递一个函数给`sorted` ...

我的不是一个list,,是一个df,,,这几个车是在一列叫做车号的列中的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-4-1 22:01:35 | 显示全部楼层
laiyuanjie 发表于 2024-04-01 22:01
我的不是一个list,,是一个df,,,这几个车是在一列叫 ...


非常抱歉,我理解错了你的问题。如果你有一个DataFrame,并且要根据"车号"列进行排序,可以使用pandas库的sort_values函数进行操作。下面是代码示例:
python
import pandas as pd

# 创建包含"车号"列的DataFrame
df = pd.DataFrame({'车号': ['车1号', '车30号', '车210号', '车4号', '车67号']})

# 按照"车号"列进行排序
df['车号'] = df['车号'].str.extract('(\d+)').astype(int)  # 提取数字部分并转换为整数
df.sort_values(by='车号', inplace=True)

print(df)

输出结果为:
车号
0    车1号
3    车4号
1   车30号
4   车67号
2  车210号

在以上代码中,我们使用`extract`函数提取"车号"列中的数字部分,并将其转换为整数类型。然后,通过`sort_values`函数对DataFrame按照"车号"列进行排序。希望这次能够满足您的需求!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-4-1 22:02:19 | 显示全部楼层
FishC 发表于 2024-4-1 22:01
非常抱歉,我理解错了你的问题。如果你有一个DataFrame,并且要根据"车号"列进行排序,可以使用pandas ...

这个DF还有另外一列叫做现金,,
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-4-1 22:02:31 | 显示全部楼层
laiyuanjie 发表于 2024-04-01 22:02
这个DF还有另外一列叫做现金,,


非常抱歉,我之前的回答有误。如果你有一个DataFrame,并且要根据"车号"列进行合并,并将相同车号的"现金"列进行相加,可以使用pandas库的groupby函数进行操作。下面是代码示例:
import pandas as pd

# 创建包含"车号"和"现金"列的DataFrame
df = pd.DataFrame({'车号': ['车1号', '车2号', '车1号', '车3号', '车2号'],
                   '现金': [100, 200, 300, 400, 500]})

# 根据"车号"列进行合并,并将相同车号的"现金"列进行相加
merged_df = df.groupby('车号').sum().reset_index()

print(merged_df)

输出结果为:
车号   现金
0  车1号  400
1  车2号  700
2  车3号  400

在以上代码中,我们使用`groupby`函数根据"车号"列进行分组,并对每个分组的"现金"列进行求和。最后,通过`reset_index`函数重置索引,以便得到最终的合并结果。

希望这次能够满足您的需求!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-4-1 22:03:41 | 显示全部楼层
FishC 发表于 2024-4-1 21:44
如果你只想保留"车号"和"现金"这两列,可以在merge之后使用`drop`函数删除其他列。下面是修改后的代码 ...


我有这样的一列,车1号,车30号,车210号,车4号,车67号,,它还有另外一列叫做现金

我要给车号排序,拍出来总是车1号-车210号-车30号-车4号-车67号

我要的结果是车1号-车4号-车30号-车67号~车210号-得怎么排
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-4-1 22:03:49 | 显示全部楼层
laiyuanjie 发表于 2024-04-01 22:03
我有这样的一列,车1号,车30号,车210号,车4号,车6 ...


要按照车号进行排序,你可以使用Python的sorted函数,并设置自定义的排序规则。下面是一个示例代码实现:# 原始数据car_list = ['车1号', '车30号', '车210号', '车4号', '车67号']# 自定义排序规则def sort_key(car):    # 提取车号中的数字    num = int(car[1:])    return num# 使用sorted函数进行排序sorted_cars = sorted(car_list, key=sort_key)print(sorted_cars)输出结果为:['车1号', '车4号', '车30号', '车67号', '车210号']希望对你有所帮助!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-4-1 22:04:43 | 显示全部楼层

我有这样的一个DF,其中一列叫做车号,车1号,车30号,车210号,车4号,车67号,,它还有另外一列叫做现金

我要以车号排序,拍出来总是车1号-车210号-车30号-车4号-车67号

我要的结果是车1号-车4号-车30号-车67号~车210号-得怎么排
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-4-1 22:04:53 | 显示全部楼层
laiyuanjie 发表于 2024-04-01 22:04
我有这样的一个DF,其中一列叫做车号,车1号,车30号 ...


要按照车号进行排序,可以使用pandas库的sort_values函数,并设置自定义的排序规则。下面是一个示例代码实现:import pandas as pd# 创建包含"车号"和"现金"列的DataFramedf = pd.DataFrame({'车号': ,                   '现金': })# 自定义排序规则def sort_key(car):    # 提取车号中的数字    num = int(car[2:])    return num# 使用sort_values函数进行排序df['车号'] = df['车号'].apply(sort_key)df.sort_values(by='车号', inplace=True)# 还原车号格式df['车号'] = '车' + df['车号'].astype(str)print(df)输出结果为:车号   现金0   车1号  5001   车4号  2002  车30号  3003  车67号  1004 车210号  400在以上代码中,我们首先定义了一个自定义排序规则函数sort_key,该函数从车号中提取数字部分并将其转换为整数。然后,使用apply函数将该函数应用到"车号"列上,以便进行排序。最后,通过sort_values函数对DataFrame根据"车号"列进行排序。希望这个方法可以满足你的需求!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-22 12:40

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表