pandas常用方法操作

全部展示所有数据行列不隐藏(前提设置)

  1. 显示所有列: pd.set_option('display.max_columns', None)
  2. 显示所有行:pd.set_option('display.max_rows', None)
  3. 设置value的显示长度为60,默认为50:pd.set_option('max_colwidth',60)
  4. 一般情况下为了看到完整数据需要联合使用:
    pd.set_option('display.max_columns', None)
    pd.set_option('display.max_rows', None)
    pd.set_option('display.width', 1000)
    pd.set_option('max_colwidth', 60)

np.set_printoptions(suppress=True)
pd.set_option('display.float_format', lambda x: '%.8f' % x) # 为了直观的显示数字,不采用科学计数法

pandas的启动初始化

  1. 导入: import pandas as pd
  2. 初始化表:pd_new = pd.DataFrame(data)
  3. 设置初始化表:pd_all = pd.DataFrame(init_data, index=None, columns=[])
    此处datad的格式:可以是list, dict, 也可以是数据库返回的结果集

初始化表格
df = pd.read_excel(f_dir, sheet_name=None, dtype={"股票代码": "str", "股东代码": "str"})

设置索引

df = df.set_index(["media", "platform", "data_time"])

列名转换

df.rename({'beijing':'A', 'shanghai':'B'}, axis='columns', inplace=True)

增加一列

df = df["new_column"] = 0

删除一列

df = df.drop(['A'], axis=1)
df = df.drop(columns=["mau"], inplace=True)

修改列值

将df表的platform字段的值如果在列表中就改写为app
df.loc[df.platform.str.lower().isin(["android", "ios"]), "platform"] = "app"

将日期格式等于每个月最后一天的日期的那一行的三列求和赋给另一个pd
df_mau = df[df.data_time == last_day][["appkey", "platform",
"mau"]].groupby(["appkey", "platform"]).sum().reset_index()

计算新增列apply

单字段-df的字段如果是小于0就改成0
df['read_count'] = df.read_count.apply(lambda x: 0
if x < 0 else x)

多字段

data = {
    "jobs": ["job1", "job2", "job3", "job4"],
    "x": [10, 1, 120, 12],
    "y": [10, -2, 0, 8],
}


def calculate_ratio(obj, x, y):
    x = float(obj[x])
    y = float(obj[y])
    if y == 0:
        z = 0
    else:
        z = round((x - y) / y, 6)
    return z


df = pd.DataFrame(data)
df['ratio'] = df.apply(calculate_ratio, axis=1, args=('x', 'y'))
print(df)

不同的数据源和并列

def data_concat(a, b):   
      df = pd.concat([a, b], sort=False)    
      return df
      
df_combine = pd.DataFrame()
if data_like:    
     df_tmp = pd.DataFrame(data_like)    
     df_combine = data_concat(df_combine, df_tmp)
     
if not df_combine.empty:    
     df_combine = pd.DataFrame(data=df_combine, index=None, columns=full_column).fillna(0) 
     data_final = df_combine.groupby("topic_id").sum().reset_index()

数据类型转换

有时候数据出来的decimal类型需要转换为float
df["X"] = df["X"].astype("int")
df["Y"] = df["Y"].astype("float")

确定小数精度

decimals = pd.Series([2, 2, 0, 2], index=['startup_user_rate','startup_total_rate', "startup_user", 'startup_avg'])
df = df.round(decimals=decimals)

数据填充0

将np.inf和np.NAN等类型转换为0
round_dict = {"startup_avg": 2, "duration_avg": 2}
pd_all = pd_all.replace(np.inf, 0).round(round_dict).fillna(0)
pd_all = pd_all.replace(np.inf, 0).fillna(0)
pd_all = pd_all.replace(np.NAN, 0).fillna(0)
pd_new = pd.DataFrame(res_new).fillna({dimension:"未知"})

列求和求平均

df['startup_user'].sum() * 100

axis 0为行,1为列
temp = student[["Test_1","Test_2","Test_3"]]
student["total"] = temp.sum(axis=1)
student["avg"] = temp.mean(axis=1)
student["total"] = student[["Test_1","Test_2","Test_3"]].sum(axis=1)

groupBy

一般groupby过后索引会变,一般默认使用reset_index
df = df.groupby(["appkey", "platform"]).sum().reset_index()

选取子集数据

data_time: 2020-05-20
挑选日期列年月日的时间如果位于2020-05月的把所有数据拿出来作为df
df = df[df['data_time'].str[0:7] == '2020-05']

合并表

pd_all = pd.merge(pd1, pd2, on=["channel"], how='outer').fillna(0)

按照列排序并且取出指定的列数据

HEADER = ["data_time", "student_name", "age"]
pd_all = pd_all[HEADER]

按照相应格式转换输出数据

orient ='dict',是函数默认的,转化后的字典形式:{column(列名) : {index(行名) : value(值) )}};
orient ='list' ,转化后的字典形式:{column(列名) :{ values }};
orient ='series' ,转化后的字典形式:{column(列名) : Series (values) (值)};
orient ='split' ,转化后的字典形式:{'index' : [index],‘columns' :[columns],’data‘ : [values]};
orient ='records' ,转化后是 list形式:[{column(列名) : value(值)}......{column:value}];
orient ='index' ,转化后的字典形式:{index(值) : {column(列名) : value(值)}};

all_list = pd_all.to_dict("split").get("data",[]) ===》一般适合直接插入数据库的列表结构
all_list_dicts =df.to_dict(orient='records') ===》一般适合生成包含所有字段的字典的列表, 比较好处理

stack and unstack

stack简单说就是把columns转成index
unstack就是把index转成columns再甚至,可以理解为:
stack是一个‘逆时针’的旋转
unstack是一个‘顺时针’旋转

将列名转换为列数据

id_vars 不需要被转换的列名,在转换后作为标识符列(不是索引列), list
value_vars 需要被转换的现有列名 , list
var_name   被转换的列名的新列名, str
value_name 被转换的列名下的数据组成的新列的名字, str
df = df.melt(id_vars=['A', 'C'], value_vars=['B'],
var_name="BCONVERTED", value_name="BDATA")

列字段转换保留两位小数+字符串拼接

if "dnu_dau" in list(detail_df.columns):
detail_df["dnu_dau_readable"] = detail_df["dnu_dau"].map(float).map(lambda x:"%.2f"%(x * 100))
detail_df["dnu_dau_readable"] = detail_df["dnu_dau_readable"].map(str) + "%"
detail_df["dnu_dau_complex"] = detail_df['dau'].map(str) + "(" + detail_df["dnu_dau_readable"].map(str) + ")"

错误

ValueError: Plan shapes are not aligned
解决: 有相同的列

分组求和

import pandas as pd
data = [{'Code': '000001.SZ', 'Num': 1}, {'Code': '000002.SZ', 'Num': 10}, {'Code': '000001.SZ', 'Num': 2}]
df = pd.DataFrame(data)
根据Code做groupBy, 然后对Num进行求和
df_series = df.groupby(by=['Code'])['Num'].sum()
生成的数据结构为两列,第一列Code, 第二列和,是Series类型, 需要转换为DF
df_sum = pd.DataFrame({'Code': df_series.index, 'SumNum': df_series.values})

删除不符合条件的行

import pandas as pd
data = [{'Code': '1', 'Research': 10}, {'Code': '2', 'Research': 2}, {'Code': '3', 'Research': 0},
{'Code': '4', 'Research': 0}]
df_new = pd.DataFrame(data)
df_new.sort_values(by=["Research"], inplace=True, ascending=[False])
rows = [x for x in df_new.index if df_new.loc[x]['Research'] <= 0] #删除Research列<=0的所有行
df01 = df_new.drop(rows, axis=0)
print(df01)

posted @ 2020-04-22 18:57  Adamanter  阅读(612)  评论(0)    收藏  举报