說我有這樣的資料框
df = pd.DataFrame({
'position': ['head', 'tail', 'head', 'head', 'head', 'tail', 'tail', 'head'],
'start': [2, 13, 54, 320, 654, 677, 3430, 9000],
'end': [4, 15, 564, 390, 674, 679, 6000, 9010],
}) #s. e. k k. s. e. k
df.head(10)
position start end
0 head 2 4
1 tail 13 15
2 head 54 564
3 head 320 390
4 head 654 674
5 tail 677 679
6 tail 3430 6000
7 head 9000 9010
我想組合行,如果位置標簽如果行是“頭”,然后連續位置是“尾”,那么這些行應該以使用“頭”中的“開始”值的方式組合,并且使用“tail”的“end”值。并且在“頭”行之后有多個連續的“尾”行,那么中間的“尾”行將被跳過。
解釋起來很棘手,但這里有一個示例資料框,說明所需的結果應該是什么樣子
position start end
0 tail 2 15
1 head 54 564
2 head 320 390
3 tail 654 6000
4 head 9000 9010
我想出了這個解決方案 iterrows
previous = None
list_dicts = []
for idx, row in df.iterrows():
if row['position'] == 'head':
if previous:
package = {'position': previous, 'start':previous_start, 'end':previous_end}
list_dicts.append(package)
previous = 'head'
previous_start = row['start']
previous_end = row['end']
elif row['position'] == 'tail':
previous = 'tail'
previous_start = previous_start
previous_end = row['end']
if row['position'] == 'head':
package = {'position': row['position'], 'start':row['start'], 'end':row['end']}
elif row['position'] == 'tail':
package = {'position': row['position'], 'start':previous_start, 'end':row['end']}
list_dicts.append(package)
pd.DataFrame(list_dicts).head(10)
但是我讀到應該避免使用 iterrows,因為它不是操作資料幀的計算效率最高的方法。在這種情況下,我求助于創建一個全新的資料框。但是在使用基于連續行的條件的情況下,這是我能想到的唯一解決方案。
uj5u.com熱心網友回復:
一種使用方式pandas.groupby:
m = df["position"].eq("head").cumsum()
new_df = df.groupby(m, as_index=False).agg({"position": "last",
"start": "first",
"end": "last"})
print(new_df)
輸出:
position start end
0 tail 2 15
1 head 54 564
2 head 320 390
3 tail 654 6000
4 head 9000 9010
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/360290.html
下一篇:比較資料框中的2個元組
