簡體   English   中英

如何在pandas DataFrame中設置給定索引級別的值

[英]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發現的所有嘗試都導致:

  • 其他具有完整長度的DataFrame或Series或
  • 要求說明個別情況

目前,我正在執行以下操作:

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索引進行sortparameters.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM