最近一直在做數據處理相關的工作,有幾點經常遇到的情況總結如下:
- 數據中存在為空數據如何處理
處理方式1:丟棄數據行
# 實現方式1
data = data.dropna(subset=['id']) # 若id列中某行數值為空,丟棄整行數據
# 實現方式2
data = df[df['id'].notna()]處理方式2:填充,定值填充或插值填充
data['value'] = data['value'].fillna(0.0) # 使用0.0對value列中空值進行填充
- 丟棄某行某列
# 如果rn列存在,丟棄該列
if 'rn' in df.columns:df = df.drop('rn', axis=1) # axis控制行列# 若直接在原數據做操作,需設置inplace參數df.drop('rn', axis=1, inplace=True)
- 如何對某列中字符串數據進行批量操作
# 設time中數據為12:34這種類型
df['time'].str.split(':',expand=True).astype(int)
# expand參數用以將分割的字符串展開為單獨的列,astype用于轉換數據類型
- 數據中不存在某列,添加列
# 添加有值的列如何做
data = {'A': ['item1', 'item2', 'item3', 'item4'],'B': ['0.1', '0.2', '0.3', '0.4']
}
df = pd.DataFrame(data)# 增加一列'id'字段, 并選擇特定行賦值
df.loc[[True, False, True, True],'id'] = ['1', '2', '3']
# 不支持同時加兩列,只能加單列# 添加無值的列,再進行處理
df['add'] = np.nan
df['add'] = np.where(df['hour'] >= 1000, 1, 0)
df['hour'] = np.where(df['hour'] >= 1000, df['hour'] - 1000, df['hour'])
- 一些日期處理函數
# pd.to_datetime
# 將day轉為datetime格式
tmp_day = pd.to_datetime(df['day'], format='%Y%m%d')# pd.to_timedelta
timestamp = tmp_day + pd.to_timedelta(df['hour'], unit='h') + pd.to_timedelta(df['min'],unit='m') + pd.to_timedelta(df['add'], unit='D')
- 一些處理函數
# id分組中,源數據只有一行batch字段有填充,函數實現將batch拓展填充到各數據行
df['batch'] = df.groupby('id')['batch'].transform(lambda x: x.fillna(method='ffill').fillna(method='bfill'))
# 首先通過groupby函數根據id列對數據進行分組,然后對每個分組使用transform函數。
# transform函數中的lambda函數使用fillna方法先向前(ffill)填充分組中的np.nan值,
# 如果某一分組中的第一行為np.nan,則之后再向后(bfill)填充。# 對每個id分組,執行apply操作,運行數據處理函數,實現功能
def trans(df):df = df.groupby('id').apply(lambda group: group.apply(process_column))return df
def process_column(col):# 若數據列名中存在period或為a b c,將該組數據用;連接起來返回if 'period' in col.name or col.name in ['a','b','c']:return ';'.join(str(v) for v in col)else:# 其余數據直接做unique返回return col.unique()