如何增加熊貓多指標特定級別的所有值?如何增加Pandas MultiIndex中的水平?
3
A
回答
2
您可以創建新MultiIndex.from_tuples
和分配:
df = pd.DataFrame({'A':[1,2,3],
'B':[4,5,6],
'C':[7,8,9],
'D':[1,3,5],
'E':[5,3,6],
'F':[7,4,3]})
df = df.set_index(['A','B'])
print (df)
C D E F
A B
1 4 7 1 5 7
2 5 8 3 3 4
3 6 9 5 6 3
#change multiindex
new_index = list(zip(df.index.get_level_values('A'), df.index.get_level_values('B') + 1))
df.index = pd.MultiIndex.from_tuples(new_index, names = df.index.names)
print (df)
C D E F
A B
1 5 7 1 5 7
2 6 8 3 3 4
3 7 9 5 6 3
與reset_index
和set_index
另一種可能的解決方案:
df = df.reset_index()
df.B = df.B + 1
df = df.set_index(['A','B'])
print (df)
C D E F
A B
1 5 7 1 5 7
2 6 8 3 3 4
3 7 9 5 6 3
解決方案與DataFrame.assign
:
print (df.reset_index().assign(B=lambda x: x.B+1).set_index(['A','B']))
個時序:
In [26]: %timeit (reset_set(df1))
1 loop, best of 3: 144 ms per loop
In [27]: %timeit (assign_method(df3))
10 loops, best of 3: 161 ms per loop
In [28]: %timeit (jul(df2))
1 loop, best of 3: 543 ms per loop
In [29]: %timeit (tuples_method(df))
1 loop, best of 3: 581 ms per loop
代碼時序:
np.random.seed(100)
N = 1000000
df = pd.DataFrame(np.random.randint(10, size=(N,5)), columns=list('ABCDE'))
print (df)
df = df.set_index(['A','B'])
print (df)
df1 = df.copy()
df2 = df.copy()
df3 = df.copy()
def reset_set(df):
df = df.reset_index()
df.B = df.B + 1
return df.set_index(['A','B'])
def assign_method(df):
df = df.reset_index().assign(B=lambda x: x.B+1).set_index(['A','B'])
return df
def tuples_method(df):
new_index = list(zip(df.index.get_level_values('A'), df.index.get_level_values('B') + 1))
df.index = pd.MultiIndex.from_tuples(new_index, names = df.index.names)
return df
def jul(df):
df.index = pd.MultiIndex.from_tuples([(x[0], x[1]+1) for x in df.index], names=df.index.names)
return df
謝謝Jeff
另一種解決方案:
df.index.set_levels(df.index.levels[1] + 1 , level=1, inplace=True)
print (df)
C D E F
A B
1 5 7 1 5 7
2 6 8 3 3 4
3 7 9 5 6 3
1
這裏有一個稍微不同的方式:
df.index = pd.MultiIndex.from_tuples([(x[0], x[1]+1) for x in df.index], names=df.index.names)
1000 loops, best of 3: 840 µs per loop
對於比較:
new_index = list(zip(df.index.get_level_values('A'),
df.index.get_level_values('B') + 1))
df.index = pd.MultiIndex.from_tuples(new_index, names = df.index.names)
1000 loops, best of 3: 984 µs per loop
的reset_index方法是慢10倍。
1
它可以是一樣簡單
df.index.set_levels(df.index.levels[0] + 1, 0, inplace=True)
演示
df = pd.DataFrame(
dict(A=[2, 3, 4, 5]),
pd.MultiIndex.from_product([[1, 2], [3, 4]])
)
df
df.index.set_levels(df.index.levels[0] + 1, 0, inplace=True)
df
+0
'TypeError:'FrozenList'不支持可變操作。'# –
+0
@JulienMarrec thx。定影 – piRSquared
相關問題
- 1. 如何增加MpChart中的水平圖表值文本大小
- 2. reindex multiindex pandas數據框
- 3. Python Pandas datetime和multiindex問題
- 4. Pandas Multiindex Groupby on專欄
- 5. 基於MultiIndex Pandas填充NaN
- 6. 如何在pandas中的groupby之後訪問MultiIndex列?
- 7. 如何水平增加此div的背景
- 8. 如何水平添加TextView?
- 9. 如何在嵌套字典中通過元素訪問pandas multiindex?
- 10. 如何從pandas multiindex中獲取隨機(bootstrap)示例
- 11. 將元組的pandas列轉換爲MultiIndex
- 12. 如何增加Gwt水平面板表格高度
- 13. 如何隨着頁面寬度增加水平自動滾動
- 14. 熊貓,計算每個MultiIndex子水平的總和
- 15. 如何在t中添加水平ScrollBar:selectOneListbox?
- 16. 如何在Javascript中添加水平線
- 17. 如何重新索引Pandas Dataframe的列索引MultiIndex?
- 18. 我如何增加在DataGrid中的行空間(水平空間)柔性
- 19. 如何添加一行到熊貓DataFrame而不展平MultiIndex
- 20. 在ggplot2中增加數字圖例的水平
- 21. 如何迭代pandas multiindex數據框使用索引
- 22. 如何在的JFreeChart的TimeSeries的Y值增加一個簡單的水平線
- 23. 水平居中水平ItemsControl
- 24. 如何在android中創建增量水平滾動條?
- 25. 如果可用空間增加水平邊距
- 26. 如何居中水平
- 27. 如何水平居中JSpinner
- 28. 如何縮小高度並增加自定義Chartjs水平線的線寬?
- 29. 如何減少/增加水平圖例之間的差距 - 高圖
- 30. 如何在Android平臺中添加水平BarGraph?
很酷,謝謝!我覺得這很奇怪,這是一個繁瑣的操作..:/ – ajwood
不幸的是。 – jezrael
我想有這樣的性能實現細節? – ajwood