pandas模块之DataFrame按条件查询、合并、转换等操作
·
import pandas as pd
import numpy as np
# data_df为已有DataFrame
# 取出指定列
data_df["name1", "name2"]
# 提取某一列某个范围内的数据,可删除不在范围内的数据
data_df = data_df[data_df["risk"] >=0]
data_df = data_df[(data_df["risk"] >=0) & (data_df["time"] <60)]
data_df = data_df[(data_df["risk"] >=0) | (data_df["time"] <60)]
# data_df["risk"] >=0 返回的是该列元素正确为true错误为False的Dataframe,要计数的话,如下
print((data_df["risk"] >=0).sum())
# 用制定内容填充NAN数据,inplace=True即在原数据上修改
data_df.fillna(0, inplace=True)
# 将某一列的数据(包含浮点型,如有NAN需先用0替换后操作)改为整型
# 列名更改一个就是在原始基础上生成新的列
data_df["age"] = data_df["age"].astype(int)
# 将多列数据转换类型
data_df = data_df.iloc[:, 2:].astype(int)
# 或者传入一个字典
data_df = data_df.iloc[:, 2:].astype({"列名": int})
# 删除重复的行
data_df = data_df.drop_duplicates()
# 给列重命名
data_df.rename(columns = {"old_name": "new_name"})
data_df.rename(columns = {"old1": "new1", "old2":"new2"}, inplace=True)
# df to dict 详情看链接
df = df.to_dict("records")
# 某一行替换NAN
df[f1].fillna(value=pd.np.nan, inplace=True)
# 某一行替换Nonetype
df[f1].replace(to_replace=[None], value=np.nan, inplace=True)
# groupby(此部分参考别人的回答,后面会放链接)
# 理解groupby
"""
groupby生成了一个对象
是按照所选择的进行划分的列名分成几组:如key1,分组后则生成
三个组:a、b、c,三个组包含三个dataframe包含该类别对于dataframe数据
如果在对象后取出某个列,则取出的是Series对象,包含了不同组的该列的数据,同样是a、b、c三个组,包含三个对应列的序列数据
"""
# groupby对象
groped_df = df.groupby("key1")
# 取出groupby对象中的数据
for name, group in groped_df:
# 分组属性对应值
print(name)
# 该组对应的DataFrame
print(group)
# series对象
s_gb = groped_df["key2"]
# 查看内容
for name, series in s_gb:
# 分组属性对应值
print(name)
# 该组数据中提取出的key2列的序列数据
print(series)
# 按key1进行分组,并查询key2列=one的总数,并计数为count列
df11 = df.groupby('key1')['key2'].apply(lambda x: (x=='one').sum()).reset_index(name='count')
print (df11)
"""
key1 count
0 a 2
1 b 1
2 c 0
"""
df['key1'] = df['key1'].astype('category')
df1 = df[df['key2'] == 'one'].groupby(['key1']).size().reset_index(name='count')
print (df1)
"""
key1 count
0 a 2
1 b 1
2 c 0
"""
df['key1'] = df['key1'].astype('category')
df1 = df[df['key2'] == 'one'].groupby(['key1']).size().reset_index(name='count')
print (df1)
"""
key1 count
0 a 2
1 b 1
2 c 0
"""
df2 = df.groupby(['key1', 'key2']).size().reset_index(name='count')
print (df2)
"""
key1 key2 count
0 a one 2
1 a two 1
2 b one 1
3 b two 1
4 c two 1
"""
df3 = df.groupby(['key1', 'key2']).size().unstack(fill_value=0)
print (df3)
"""
key2 one two
key1
a 2 1
b 1 1
c 0 1
"""
# 根据条件生成多个新的列,并命名,更多细节参考后面链接
df_gpb = df.groupby(["key1", "key2"])
df4 = df_gpb.agg({"data1": {lambda x: (x == 3).sum(), lambda x: (x == 4).sum()}}).astype(int).reset_index()
df4.columns = ["key1", "key2", "count3", "count4"]
# 根据多列进行groupby并统计
df = df.groupby([table_package_key, table_product_key, table_stage_key], as_index=False)[table_id_key].count()
df["unique_key"] = df.apply(lambda x: "_".join([x[table_package_key], x[table_product_key]]), axis=1)
# 将行转换为列 "unique_key"为链接列,table_stage_key为要转换的列,table_id_key要展示的内容
df_new = df.pivot("unique_key", table_stage_key, table_id_key)
# 合并两个表
df = pd.merge(df[[table_package_key, table_product_key, "unique_key"]],df_new, on="unique_key")
# 合并(参考博文,后面有链接)
# 1.concat
pd.concat(objs, axis=0, join='outer', join_axes=None, ignore_index=False, keys=None, levels=None, names=None, verify_integrity=False, copy=True)
# 基本用法
pd.concat([df1, df2])
# 2.append
append(self, other, ignore_index=False, verify_integrity=False)
# 基本用法
df1.append(df2)
# 3.merge
pd.merge(left, right, how='inner', on=None, left_on=None, right_on=None, left_index=False, right_index=False, sort=True, suffixes=('_x', '_y'), copy=True, indicator=False, validate=None)
# 基本用法
pd.merge(df1, df2)
不定期更新…
写的比较好的链接,细节都写得比较清楚:
DataFrame之groupby
DataFrame之合并(concat, merge, concat)
DataFrame之groupby:agg生成新列(一个或多个)
DataFrame.to_dict()详解
更多推荐

所有评论(0)