我希望按特定列重新索引dataframe的行,假设dataframe包含列colX。这意味着我需要调用方法df.set_index(colX)
假设df.head()是
colX colY
2.71 foo1
3.14 foo2
6.9 foo3
6.9 foo4
9.6 foo5当我重新索引它的时候
df=df.set_index('colX')
df2=df.reindex(index=[9.6,6.9,6.9,3.14,2.71])我希望df2.head()的结果是
colX colY
9.6 foo5
6.9 foo3 # duplicate index in colX
6.9 foo4 # duplicate index in colX
3.14 foo2
2.71 foo1或者这个
colX colY
9.6 foo5
6.9 foo4 # duplicate index in colX
6.9 foo3 # duplicate index in colX
3.14 foo2
2.71 foo1如果存在重复轴,则重新索引将无法工作。
ValueError:无法从重复轴重新索引
注意: df是由df=pd.read_csv('foobar.csv')创建的
发布于 2021-12-14 14:27:03
错误意味着至少有一个重复的值,因此reindex会引发错误,因为只处理传递给reindex的列表中的唯一值。
由GroupBy.cumcount和DataFrame.merge创建的具有默认内部连接的helper列的解决方案:
df['g'] = df.groupby('colX').cumcount()
L = [9.6,6.9,6.9,3.14,2.71]
df11 = pd.DataFrame({'colX': L})
df11['g'] = df11.groupby('colX').cumcount()
print (df11)
colX g
0 9.60 0
1 6.90 0
2 6.90 1
3 3.14 0
4 2.71 0
df = df.merge(df11, on=['colX','g'])
print (df)
colX colY g
0 2.71 foo1 0
1 3.14 foo2 0
2 6.90 foo3 0
3 6.90 foo4 1
4 9.60 foo5 0或使用reindex
df['g'] = df.groupby('colX').cumcount()
L = [9.6,6.9,6.9,3.14,2.71]
df11 = pd.DataFrame({'colX': L})
df11['g'] = df11.groupby('colX').cumcount()
print (df11)
df=df.set_index(['colX', 'g']).reindex(df11.set_index(['colX','g']).index)
print (df)
colY
colX g
9.60 0 foo5
6.90 0 foo3
1 foo4
3.14 0 foo2
2.71 0 foo1错误的第一个解决方案:
df=df.set_index('colX')
df2=df.loc[[9.6,6.9,6.9,3.14,2.71]]
print (df2)
colY
colX
9.60 foo5
6.90 foo3 > combinations of 6.9 (2 times in original * 2 times in list = 4)
6.90 foo4
6.90 foo3
6.90 foo4
3.14 foo2
2.71 foo1https://stackoverflow.com/questions/70350564
复制相似问题