亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何為 Pandas DataFrame 中的給定索引級別設置值

如何為 Pandas DataFrame 中的給定索引級別設置值

慕容708150 2021-09-01 15:05:24
我正在嘗試設置多索引熊貓 DataFrame 中一列的所有值,僅指定單個索引級別的數據。到目前為止我提出的解決方案并不令人滿意,但這可能最好用代碼來解釋:from pandas import MultiIndex, DataFrameidx = MultiIndex.from_product([['A', 'B'], [1, 2, 3]],                              names=['Cases', 'Time'])parameters = DataFrame(index=idx)parameters['CaseAndTimeInvariant'] = 1parameters['CaseAndTimeVariant'] = 1, 2, 3, 4, 5, 6# Set the values in 'Time' for all cases to 1, 2, 3parameters['CaseInvariantTimeVariant'] = 1, 2, 3# ValueError: Length of values does not match length of index這個錯誤很明顯,因為我沒有指定數據應該在哪個級別的任何地方。如果我有另一個“案例”,數據的長度不足以確定我對上面最后一行代碼的意思。我顯然需要做的是告訴parameters我傳遞的數據是針對“時間”索引級別的。但是,我發現的所有使用loc-indexing 的嘗試都會導致:其他全長的 DataFrames 或 Series 或需要對個別場景進行規范目前我正在做以下事情:for c in parameters.index.levels[0]:    parameters.loc[(c, slice(None)), 'CaseInvariantTimeVariant'] = 1, 2, 3導致:雖然這符合我的要求,但在兩個方面感覺不滿意:它需要兩行相當神秘的行來做一些看似簡單的事情:(設置Time使用我給你的這個迭代的所有值?。┪覀冃枰@式迭代所有被處理相同的索引級別,所以這不能很好地推廣到兩個以上的級別似乎“groupby”在這里可能會有所幫助,但直到現在我還無法制作大量文檔。
查看完整描述

1 回答

?
白板的微信

TA貢獻1883條經驗 獲得超3個贊

如果我們總是想將序列與最內層對齊,我們可以:


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在分配序列之前,我們仍然需要索引: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))


查看完整回答
反對 回復 2021-09-01
  • 1 回答
  • 0 關注
  • 252 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號