[英]Reindex rows of a a dataframe based on condition
具有如下數據框:
data = {'number':[4,3,3,3,3,3,3,3,3,3,4,5],'name':['L6','L6','L6','L6','L6','L8','L8','L8','L9','L9','L8','L9'],
'product1':['B','C','A','A','A','A','B','B','D','D','D','E'],
'product2':['D','A','B','Z','C','G','G','T','E','W','T','Q']}
df = pd.DataFrame(data)
df
需要基於列表替換所有行或重新索引 dataframe 開頭的行。
lst = [(3,'L6','A'),(3,'L8','B'),(3,'L9','D')]
下圖顯示了預期的 output:
使用pd.MultiIndex
和get_indexer_for
獲取 my_list 中值的索引。
然后使用np.setdiff1d
和np.arange(len(df))
找到剩余的索引,並找到第一個索引
然后使用np.concatenate
將它們組合起來以獲得所需的索引順序
然后用新順序reindex
df 。
my_list = [(3,'L6','A'),(3,'L8','B'),(3,'L9',D)] #Don't use 'list' for name
mi = pd.MultiIndex.from_arrays([df['number'], df['name'], df['product1']])
first_rows_indexes = mi.get_indexer_for(my_list)
remaining_indexes = np.setdiff1d(np.arange(len(df)), first_rows_indexes)
df = df.reindex(np.concatenate([first_rows_indexes, remaining_indexes]))
打印(df):
number name product1 product2
2 3 L6 A B
3 3 L6 A Z
4 3 L6 A C
6 3 L8 B G
7 3 L8 B T
8 3 L9 D E
9 3 L9 D W
0 4 L6 B D
1 3 L6 C A
5 3 L8 A G
10 4 L8 D T
11 5 L9 E Q
從元組列表中創建一個 dataframe,然后與給定的 dataframe 進行外部合並,以根據 lst 中的鍵順序自動排序
order = pd.DataFrame(lst, columns=['number', 'name', 'product1'])
order.merge(df, how='outer', sort=False)
number name product1 product2
0 3 L6 A B
1 3 L6 A Z
2 3 L6 A C
3 3 L8 B G
4 3 L8 B T
5 3 L9 D E
6 3 L9 D W
7 4 L6 B D
8 3 L6 C A
9 3 L8 A G
10 4 L8 D T
11 5 L9 E Q
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.