使用原始 csv 檔案,我匯入以下 df
import pandas as pd
import numpy as np
# assign data of lists.
data = {'INTERVAL': ['100 A', '100 A or 20 B', '100 A or 20 B or 3 C','5 C']}
# Create DataFrame
df = pd.DataFrame(data)
# Print the output.
print(df)
我的目標是將單元格 INTERVAL 的內容根據其單位拆分為特定的列,就像這樣:
# Objective
data = {'INTERVAL': ['100 A', '100 A or 20 B', '100 A or 20 B or 3 C','5 C'],'INTERVAL_A': ['100', '100', '100',np.nan],'INTERVAL_A': ['100', '100', '100',np.nan],'INTERVAL_B': [np.nan, '20', np.nan, np.nan],'INTERVAL_C': [np.nan, np.nan, '3','5']}
# Create DataFrame
df = pd.DataFrame(data)
# Print the output.
print(df)
我能夠拆分間隔列并將內容分配給其他列,當間隔列的排列不同時,這種方法會失敗,請參閱以下代碼片段的最后一行。
# Split Interval
A0 = df['INTERVAL'].str.split(pat="or",expand=True, n=-1)
df['INTERVAL_X1'] = A0.loc[:,0] # Assign
df['INTERVAL_X2'] = A0.loc[:,1]
df['INTERVAL_X3'] = A0.loc[:,2]
那么回圈遍歷 INTERVAL_X 列的內容并根據單元重新分配內容的好方法是什么?另一個問題是如何僅隔離值,因為列的標簽包含有關單位的資訊?
謝謝大家
預期輸出:
INTERVAL INTERVAL_A INTERVAL_B INTERVAL_C
0 100 A 100 NaN NaN
1 100 A or 20 B 100 20 NaN
2 100 A or 20 B or 3 C 100 NaN 3
3 5 C NaN NaN 5
uj5u.com熱心網友回復:
您可以使用正則運算式來匹配后跟空格和大寫字母和的數字str.extractall。然后重塑您的資料,最后join到原始資料框:
df2 = (df['INTERVAL'].str.extractall('(?P<INTERVAL>\d ) (?P<ID>[A-Z])')
.droplevel(1)
.set_index('ID', append=True)
.unstack('ID')
)
df2.columns = df2.columns.map('_'.join)
df.join(df2)
輸出:
INTERVAL INTERVAL_A INTERVAL_B INTERVAL_C
0 100 A 100 NaN NaN
1 100 A or 20 B 100 20 NaN
2 100 A or 20 B or 3 C 100 20 3
3 5 C NaN NaN 5
微調
如果您有更長的識別符號(例如,A/AB/GHI),請使用:'(?P<INTERVAL>\d ) (?P<ID>[A-Z] )'。
如果您有可選或多個空格: '(?P<INTERVAL>\d )\s*(?P<ID>[A-Z] )'
uj5u.com熱心網友回復:
靈感來自@mozway 的回答:
df.join(
df['INTERVAL'] # Select column to extract info from
.str.extractall('(?P<INTERVAL>\d ) (?P<ID>[A-Z])') # Extract INTERVAL and ID as different columns
.pivot(columns="ID") # Use values of ID column as columns
.droplevel(0, axis=1) # Drop original column name from columns' levels
.sum(level=0) # Collapse values to ID col
)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/403630.html
標籤:
下一篇:如何縮進一行之后的所有行?
