数据帧的合并

2024-04-20 12:31:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我希望将一组数据与该数据的汇总汇总进行比较。你知道吗

在下面的例子中,我想知道与所有餐馆的总收入相比,每个餐馆能赚多少钱。我想在白天知道这个。如果当天餐厅关闭,我仍然希望返回当天的名称和餐厅名称,并在“总账单”列中加上NaN(或零)。你知道吗

(我知道还有其他方法可以做到这一点,但请将此视为一个关于合并的问题,因为需要使用两个不同的数据帧进行合并是有原因的)

所以,我想要的结果是:

day   total_bill_x   restaurant   total_bill_y

Fri        651.76   DINER A     325.88 
Sat      3,556.80   DINER A   1,778.40 
Sun      1,627.16   DINER A        NaN 
Thur     2,192.66   DINER A   1,096.33 

但由于外连接的工作性质,我能得到的最远结果是:

day   total_bill_x   restaurant   total_bill_y

Fri        651.76   DINER A   325.88 
Sat      3,556.80   DINER A   1,778.40 
Sun      1,627.16   NaN        NaN 
Thur     2,192.66   DINER A   1,096.33 

问题是,我想不出有什么合并可以支持这种类型的输出-如果没有匹配的话,食客A就会消失。你知道吗

更糟糕的是,我的真实数据集将由几十家餐厅组成。你知道吗

有没有可能做一个外部连接,如果不匹配,它会从要连接到的表中获取字段?对于较小表中没有匹配项的记录,如何查看较大表中的所有记录?你知道吗

我认为这是一个有趣的问题,而且我对其他人如何处理这个问题很感兴趣。。谢谢!你知道吗

示例代码如下:

import pandas as pd
df=pd.read_csv("https://raw.githubusercontent.com/wesm/pydata-book/master/ch08/tips.csv", sep=',')
df2=pd.read_csv("https://raw.githubusercontent.com/wesm/pydata-book/master/ch08/tips.csv", sep=',')

df=df[df['day']!="Sun"]
df['restaurant']="DINER A"
df3=df.append(df2)
df_output=df.groupby(['restaurant','day'])[['total_bill']].sum().reset_index()
df_output2=df3.groupby(['day'])[['total_bill']].sum().reset_index()

pd.merge(df_output2,df_output, on='day', how="outer")

Tags: csv数据名称dfnan餐厅restauranttotal
2条回答

你可以分两步来做。首先将餐厅A的总账单的值映射到df\ U output2

df_output2['DINER_A'] = df_output2['day'].map(df_output.set_index('day')['total_bill'])

给你

    day     total_bill  DINER_A
0   Fri     651.76      325.88
1   Sat     3556.80     1778.40
2   Sun     1627.16     NaN
3   Thur    2192.66     1096.33

现在将DINER_A列融化,创建两列restaurant和total_bill

df_output2 = pd.melt(df_output2, id_vars=['day', 'total_bill'],var_name="restaurant", value_name="total_bill_A")

你得到了吗

    day    total_bill   restaurant  total_bill_A
0   Fri    651.76       DINER_A     325.88
1   Sat    3556.80      DINER_A     1778.40
2   Sun    1627.16      DINER_A     NaN
3   Thur   2192.66      DINER_A     1096.33

设置

df = pd.read_csv(
    "https://raw.githubusercontent.com/wesm/pydata-book/master/ch08/tips.csv", sep=',')

d1 = pd.concat([df.query('day != "Sun"'), df], keys=['DINER A', 'DINER B']) \
    .rename_axis(['restaurant', None]).reset_index('restaurant')

建立一个pd.MultiIndex与所有餐厅和日子

mux = pd.MultiIndex.from_product([
        d1.restaurant.unique(),
        d1.day.unique()
    ], names=['restaurant', 'day'])

groupby+join+reindex

d2 = d1.groupby(['day']).total_bill.sum()
d3 = d1.groupby(['restaurant', 'day'])[['total_bill']].sum()

d3.reindex(mux).join(d2, lsuffix='_x', rsuffix='_y').reset_index()

  restaurant   day  total_bill_x  total_bill_y
0    DINER A   Sat       1778.40       3556.80
1    DINER A  Thur       1096.33       2192.66
2    DINER A   Fri        325.88        651.76
3    DINER A   Sun           NaN       1627.16
4    DINER B   Sat       1778.40       3556.80
5    DINER B  Thur       1096.33       2192.66
6    DINER B   Fri        325.88        651.76
7    DINER B   Sun       1627.16       1627.16

相关问题 更多 >