微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Pandas:如何在减法后保留行顺序?

如何解决Pandas:如何在减法后保留行顺序?

我有三列两个数据帧,具有相同的列名。我想减去第三列,其中第一的第二列中的值,并匹配的值。我已经试过如下:

# Common column names
columns = ["month","category","sum"]

# First data frame
data1 = [("jan","j",10),("feb","f",20)]
df1 = pd.DataFrame.from_records(data1,columns=columns)

# Second data frame
data2 = [("jan",9.5),("mar","m",30)]
df2 = pd.DataFrame.from_records(data2,columns=columns)

print(df1)  # Observe order of `month`s: jan,feb
print(df2)  # Observe order of `month`s: jan,mar

# Subtract `sum` where `month`,and `category` match:
df1.set_index(["month","category"]).subtract(df2.set_index(["month","category"])).reset_index()

这产生以下输出。 观察到行上按字母顺序排序month

  month category  sum
0   feb        f  NaN
1   jan        j  0.5
2   mar        m  NaN

我怎样才能保持左手操作数的行顺序? IE。如何可以得到以下输出(或类似):

  month category  sum
1   jan        j  0.5
0   feb        f  NaN
2   mar        m  NaN

解决方法

pd.merge 将保留左操作数的顺序,然后您可以计算两列之间的差异。例如,您可以这样做:

df3 = pd.merge(df1,df2,on=["month","category"],how="outer")
df3.loc[:,"difference"] = df3["sum_x"] - df3["sum_y"]

对您的数据产生的影响:

  month category  sum_x  sum_y  difference
0   jan        j   10.0    9.5         0.5
1   feb        f   20.0    NaN         NaN
2   mar        m    NaN   30.0         NaN
,

您可以对列进行分类并指定您认为合适的任何顺序:

df1['month'] = pd.Categorical(df1['month'],categories=['jan','feb','mar'],ordered=True)
df2['month'] = pd.Categorical(df2['month'],ordered=True)

# Subtract `sum` where `month`,and `category` match:
res = df1.set_index(["month","category"]).subtract(df2.set_index(["month","category"])).reset_index()
print(res)

输出

  month category  sum
0   jan        j  0.5
1   feb        f  NaN
2   mar        m  NaN
,

试试这个:

df1.sort_index(inplace=True)

这只是强制数据框按索引排序。 在此处找到更多文档:https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.sort_index.html

,

由于 pandas 版本 1.1.0 sort_values 可以采用参数 key。您可以使用该参数传递所需的订单:

order = {"jan": 0,"feb": 1,"mar": 2}
df1.set_index(["month","category"])).reset_index().sort_values(by=['month'],key=lambda x: x.map(order))

输出:

    month   category    sum
1     jan          j    0.5
0     feb          f    NaN
2     mar          m    NaN

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。