我想按特定列重新索引資料框的行,假設資料框包含 column 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')
uj5u.com熱心網友回復:
錯誤意味著至少有一個重復的值,所以會reindex引發錯誤,因為只處理傳遞給reindex.
通過創建輔助柱的解決方案GroupBy.cumcount,并DataFrame.merge與默認內部聯接:
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 foo1
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/381285.html
