如何解决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 举报,一经查实,本站将立刻删除。