[英]How to set values for a given index level in a pandas DataFrame
我試圖在多索引的熊貓DataFrame中設置列的所有值,僅為單個索引級別指定數據。 到目前為止,我提出的解決方案並不令人滿意,但這可能最好用代碼來解釋:
from pandas import MultiIndex, DataFrame
idx = MultiIndex.from_product([['A', 'B'], [1, 2, 3]],
names=['Cases', 'Time'])
parameters = DataFrame(index=idx)
parameters['CaseAndTimeInvariant'] = 1
parameters['CaseAndTimeVariant'] = 1, 2, 3, 4, 5, 6
# Set the values in 'Time' for all cases to 1, 2, 3
parameters['CaseInvariantTimeVariant'] = 1, 2, 3
# ValueError: Length of values does not match length of index
錯誤非常明顯,因為我沒有在任何地方指定數據應該達到的級別。 如果我有另一個“案例”,那么數據的長度不足以確定我對上面代碼的最后一行的意思。
我顯然需要做的就是告訴parameters
我傳遞的數據是針對“時間”索引級別的。 但是,我使用loc
-indexing發現的所有嘗試都導致:
目前,我正在執行以下操作:
for c in parameters.index.levels[0]:
parameters.loc[(c, slice(None)), 'CaseInvariantTimeVariant'] = 1, 2, 3
導致:
雖然這樣做符合我的要求,但在兩個方面感到不滿意:
Time
所有值!) 看來'groupby'在這里可能會有所幫助,但是直到現在我還不能制作很多文檔。
如果我們總是想將序列與最內層對齊,則可以:
sequence = [1, 2, 3]
inner_level = parameters.index.get_level_values(len(parameters.index.levels) - 1)
n = inner_level.size // inner_level.nunique()
parameters['CaseInvariantTimeVariant'] = sequence * n
*請注意,在分配序列之前,我們仍然需要sort
索引進行sort
: parameters.sort_index(inplace=True)
。
下面,如果我們要使用外部級別:
我將對sort_index
,然后將序列重復n
次,其中n
是唯一索引的長度(數據中的Cases
)。
parameters.sort_index(inplace=True)
my_sequence = (1, 2, 3)
# below by level: parameters.index.get_level_values(0).nunique()
n = parameters.index.get_level_values('Cases').nunique()
parameters['CaseInvariantTimeVariant'] = my_sequence * n
如果您希望某個函數始終按最外部的索引重復序列:
def repeat_seq_by_outer_index(index, sequence):
return sequence * index.get_level_values(0).nunique()
repeat_seq_by_outer_index(parameters.index, (1, 2, 3))
如果您想要一個函數始終將索引的nth
級別重復一個序列:
def repeat_seq_by_nth_index(index, level, sequence):
return sequence * index.get_level_values(level).nunique()
repeat_seq_by_nth_index(parameters.index, 0, (1, 2, 3))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.