添加两个数据帧,但保留第一个数据帧的索引顺序

2024-09-30 04:37:06 发布

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

我制作了两个示例数据帧,它们都有相同的列名(bucket和amount),对于这两个数据帧,“bucket”是索引

df1有更多的行(完整的集合),df2有行的子集

当我将df2添加到df1中时,操作运行得很好,但索引位置会移动,并且与原始df1的存储桶的顺序不同=['3M'、'6M'、'9M'、'1Y'、'2Y'、'3Y']。。它们类似于1Y、2Y、3M等。在添加操作之后,如何保留ds1原始索引顺序

Buckets=['3M','6M','9M','1Y','2Y','3Y']
Amount1=[1,2,3,4,5,6]
Buckets2=['1Y','2Y','3Y']
Amount2=[4,5,6]
df1 = pd.DataFrame(columns = ['Buckets','Amount'])
df1.loc[:,'Amount']=Amount1
df1.loc[:,'Buckets']=Buckets
df1.set_index('Buckets',inplace=True)
df2 = pd.DataFrame(columns = ['Buckets','Amount'])
df2.loc[:,'Amount']=Amount2
df2.loc[:,'Buckets']=Buckets2
df2.set_index('Buckets',inplace=True)
df1=df1.add(df2,fill_value=0)
print(df1)

Tags: columns数据dataframebucket顺序amountlocpd
3条回答

^{}将执行数据帧对齐,如果索引尚未对齐,则该对齐将涉及排序操作。可以在添加之前或之后使df2{a2}{}

df1 = df1.add(df2, fill_value=0).reindex_like(df1)

df1 = df1.add(df2.reindex_like(df1), fill_value=0)

*注意reindex_like将对齐列和索引,如果只想对齐索引,可以使用^{}

df1 = df1.add(df2, fill_value=0).reindex(df1.index)

df1 = df1.add(df2.reindex(df1.index), fill_value=0)

或者,可以从两个索引的df1.index创建一个^{},然后sort操作生成正确的顺序:

# Create CategoricalDtype
cat_dtype = pd.CategoricalDtype(df1.index, ordered=True)
# Change index dtypes to categorical
df1.index = df1.index.astype(cat_dtype)
df2.index = df2.index.astype(cat_dtype)
# Add aligns correctly based on Categorical Ordering
df1 = df1.add(df2, fill_value=0)

所有选项都产生df1

         Amount
Buckets        
3M          1.0
6M          2.0
9M          3.0
1Y          8.0
2Y         10.0
3Y         12.0

您可以使用loc将旧索引切回:

df1.add(df2,fill_value=0).loc[df1.index]

输出:

         Amount
Buckets        
3M          1.0
6M          2.0
9M          3.0
1Y          8.0
2Y         10.0
3Y         12.0

虽然前面的答案都适用,但我更喜欢以下语法:

df1.update(df1 + df2)

这不需要任何进一步的排序或重新索引,因此它比其他解决方案更易于阅读

这背后的思想是df1+df2返回两个数据帧的总和,或者对于df2不包含值的数据帧返回NaN。更新将覆盖df1中的现有值,但仅在总和不为NaN的情况下

相关问题 更多 >

    热门问题