Pandas
太大的csv文件最好不要用wps打开,保存的时候有些数据会保存成#NAME?
# Pandas.DataFrame
数据按照行字段过滤
article_df = article_df[article_df['vv'] > vv_threshold]
使用apply方法新建一行,并过滤
article_df['is_filter'] = article_df['content'].apply(lambda x: str(x).startswith('{"rich_content"'))
article_df = article_df[article_df['is_filter'] == False]
按照某个字段的列表长度进行过滤
df[df.c.map(len)>1]
df.loc[np.array(list(map(len,df.c.values)))>1]
df[df.c.apply(lambda x: len(x) > 1)]
过滤,多个条件可以使用条件语句
df_slice = df.loc[(df['A'] == 4) & (df['C'] == 6)]
range_pdf = in_pdf[(in_pdf['date'] >= left) & (in_pdf['date'] <= right)]
过滤(query)
newdf = df.query('产品 == "纺织" & 产量 > 50')
使用np创建一个pd
data=pd.DataFrame(np.arange(16).reshape(4,4),index=list('abcd'),columns=list('ABCD'))
df = pd.DataFrame(np.arange(16).reshape(4, 4), index=pd.date_range('20200101', periods=4) , columns=list('ABCD')
df = pd.DataFrame(np.random.randn(10, 4), columns=list('ABCD'))
使用字典创建一个pd,要求字典的键是header
df = pd.DataFrame.from_dict(data_dict)
使用数组创建一个pd,要求数组中的元素是数组,为每一行的数据
data_list = [[1, 25, ’男’], …]
headers = [‘id‘, ’年龄‘, ’性别‘]
df = pd.DateFrame(data_list, columns=headers)
移动pd中header的位置
new_header中是新的header的位置
new_pd = all_union_pdf[new_header]
对pd按照score字段排序,并按照user, subject两个字短group
df.sort_values(by='score').groupby(['user', 'subject'])
sort_values不原地改变,返回排序号的对象
sort_values方法参数:
by : str or list of str(字符或者字符列表)
ascending : bool or list of bool, default True(是否升序排序,默认升序为True,降序则为False。如果是列表,则需和by指定的列表数量相同,指明每一列的排序方式)
na_position : {‘first’,‘last’}, default ‘last'.(如果指定排序的列中有nan值,可指定nan值放在第一个还是最后一个)
article_df_group['uv'].sum()
pandas to_dict
pd.to_dict(orient=‘dict’) # {column -> {index -> value}}
pd.to_dict(orient=‘index’) # {index -> {column -> value}}
pd.to_dict(orient=‘list’) # {column -> [values]}
pd.to_dict(orient=‘series’) # {column -> Series(values)}
pd.to_dict(orient=‘split’) # {index -> [index], columns -> [columns], data -> [values]}
pd.to_dict(orient=‘records’) # [{column1 -> value, column2 -> value, …}, … , {column1 -> value, ….}]
新建索引,并把老索引拿出来并生成一个新的列
reset_index后老索引默认生成的列名为’index’
df = df.reset_index().rename(columns={"index":"new"})
新建索引不保留之前的索引
df = df.reset_index(drop=True)
新建索引,之前的搜索默认
对pd按照字段编号
df['C'] = df.groupby(['A','B']).cumcount()+1
pd 插入一列
df在左边添加一列索引
df.insert(0, 'index', range(len(df)), allow_duplicates=False) # 0表示放在第0列,range(len(df))为数据,allow_duplicates=False不允许列名重复
df在最后插入一列
df = df.insert(data.shape[1], 'd', 0)
直接赋值
df = df[‘d’] = 0
reindex
data = data.reindex(columns=['a', 'b', 'c', 'd'], fill_value=0) # 要把之前需要保留的列都写上
concat
data = pd.concat([data, pd.DataFrame(columns=['d'])], sort=False)
loc
data = data.loc[:, 'd'] = 0
读取或者选择几列
df = pd.DataFrame(df, columns=[‘a’, ‘b’])
df[[‘a’, ‘b’]]
df.loc[:, [‘b’, ‘c’]]
df.iloc[:, 2:]
pd.read_csv(‘文件.csv’, usecols=[‘a’, ‘b’, ‘c’])
# 排序
pd.sort_values(by=[‘a’, ‘b’], inplace=False, ascending=True) # inplace 是否原地排序
查看df的数据
df.head(2)
# groupby
as_index, 不让groupby的label变为index
oldest_staff = data.groupby('company',as_index=False).apply(get_oldest_staff)
# 删除重复列
下面两个写法一样
article_df_all = article_df_all.drop_duplicates('topic_id')
article_df = article_df_all.drop_duplicates(subset = [ 'cluster_id' ] )
# 根据所有列删除重复行
df.drop_duplicates()
保留最后一行(last),第一行(first)
df.drop_duplicates(subset=['brand', 'style'], keep='last')
重复的全部去掉
f=df.drop_duplicates(keep=False)
# drop
DataFrame.drop(labels=None,axis=0, index=None, columns=None, inplace=False)
默认参数 axis=0,表示对行进行操作,如需对列进行操作需要更改默认参数为 axis=1,
默认参数 inplace=False,表示该删除操作不改变原数据,而是返回一个执行删除操作后的新 dataframe,如需直接在原数据上进行删除操作,需要更改默认参数为 inplace=True
| labels | 就是要删除的行列的名字,用列表给定 |
| axis | 默认为 0,指删除行,因此删除 columns 时要指定 axis=1; |
| index | 直接指定要删除的行 |
| columns | 直接指定要删除的列 |
# concat连接
df_concat = pd.concat([title_word_df, content_word_df], axis=1)
applymap
applymap的用法比较简单,会对DataFrame中的每个单元格执行指定函数的操作
获取列名的列表
df.columns
多重聚合
df.groupby('A').agg(['min', 'max'])
'''
B C
min max min max
A
1 1 2 0.227877 0.362838
2 3 4 -0.562860 1.267767
'''
**
# as_index
oldest_staff = data.groupby('company',as_index=False) # company字段不会被当作索引
iloc的使用
df.iloc[-1, :] # 返回df的最后一条数据
transform的使用
添加新的一行,值根据group的结果计算
data['avg_salary'] = data.groupby('company')['salary'].transform('mean')
相当于
avg_salary_dict = data.groupby('company')['salary'].mean().to_dict() # 求平均
data['avg_salary'] = data['company'].map(avg_salary_dict) # 映射
pd.isna()
判断pd中某个值是否存在,如果不存在返回True
pd.isnull()
pd.isnull()可以对不论是DataFrame、Python list还是仅仅一个数值进行空值检测
首先创建一个DataFrame:
df = pd.DataFrame({'a':[0,1,2,np.nan]})
df
a
0 0.0
1 1.0
2 2.0
3 NaN
测试isnull()
pd.isnull(df)
a
0 False
1 False
2 False
3 True
测试isna()
pd.isna(df)
a
0 False
1 False
2 False
3 True
groupby之后每一行是一个pd.DataFrame
pd.DataFrame[‘header’].tolist()可以对其中的某一列数据进行处理
拿到某个字段的字符串,并且字符串中要包含…
.str.contains(‘&’)
self._common_pdf = conf_pdf[(conf_pdf['version'].str.contains('&')) &
(conf_pdf['version'] != version)]
# groupby操作
df_agg = df.groupby('Country').agg(['min', 'mean', 'max'])
num_agg = {'Age':['min', 'mean', 'max'], 'Income':['min', 'max']}
print(df.groupby('Country').agg(num_agg))
df.groupby(['key1'])['data1'].min()
df.groupby(['key1'])['data1'].agg({'min'})
df.groupby(['key1']).agg({'data1':'min'}) #对data1列,取各组的最小值,名字还是data1
df.groupby(['key1'])['data1'].agg({'min','max'}) # 按key1分组后,aggregate各组data1的最小值和最大值
df.groupby(['key1']).agg({'data1':['min','max']})
groupby之后直接.reset_index()可以得到一个没有多级索引的DataFrame
统计各个分组的行数
df = df.groupby('date').size() # 统计各个分组行数
或者这样统计
df.groupby(['key1']).agg({'data1':['min','max’, ‘size’]})
size: 行数,mean:平均,median:中位数,min,max
grouby之后求行数
size和count的区别
import pandas as pd
a = {'name':['jack', 'rose', 'jack'], 'age': [21, 23, 24], 'nation': ['us', 'uk', 'us']}
test_pdf = pd.DataFrame.from_dict(a)
test_pdf
name age nation
0 jack 21 us
1 rose 23 uk
2 jack 24 us
test_pdf.groupby('nation').size().reset_index()
nation 0
0 uk 1
1 us 2
test_pdf.groupby('nation').count().reset_index()
nation name age
0 uk 1 1
1 us 2 2
重命名
df.rename({‘old_col1':‘new_col1',‘old_col2':‘new_col2',…})重命名
groupby
df['data1'].groupby([df['key1'],df['key2']]).mean()
等价于:df.groupby(['key1','key2'])['data1'].mean()
pd.Dataframe操作
获取中位数
pdf.quantile()
获取某一分位值
pdf.quantile(0.995)
min # 最小值
max # 最大值
mean # 平均值
median # 中位数
std # 标准差
sum # 总数
# 查看前十条数据
df.head(10)
# 取某一列中不重复的值
df.column_name.unique()
# pd.core.frame.DataFrame
df_res = pd.core.frame.DataFrame(
{"content": list_content, "label": list_label, "pred": list_pred})
# 通过字符串中是否包含某个内容进行过滤
df[df["description"].str.contains("used car")]
df_train = df_train[(df_train['origin'].str.contains('ad') == False) & (df_train['origin'].str.contains('广告') == False)]
字符串过滤
按长度
df[df["description"].str.len() > 15]
df[df["description"].apply(lambda x: len(x) > 15)]
按起始字符
df[df["lot"].str.startswith("A")]
是否能转字符
df[df["price"].apply(lambda x: x.isnumeric()==True)]
字符出现次数
df[df["description"].str.count("used") < 1]
字符串出现在列表中
pdf = pdf[pdf['origin'].isin(
['toutiao_test', 'ad_test', 'douyin_test', 'search_test'])]
# sample采样
df.sample(frac=1)
这样对可以对df进行shuffle。其中参数frac是要返回的比例,比如df中有10行数据,我只想返回其中的30%,那么frac=0.3。
有时候,我们可能需要打混后数据集的index(索引)还是按照正常的排序。我们只需要这样操作
df.sample(frac=1).reset_index(drop=True)
# shuffle
from sklearn.utils import shuffle
df = shuffle(df)
另外,numpy库中也有进行shuffle的方法(不建议)
df.iloc[np.random.permutation(len(df))]
# 多列生成新列
data["x1"]**=data[["a","b"]] . apply(lambda x:x["a"] + x["b"],axis=**1)
关键的参数是axis=1,指定计算的方向是行而不是列,默认是0,也就是按列进行计算
# fillna
pdf = pd.read_csv(csv_file).fillna(
value={
'yuntu': '', 'entity': '',
'entity_accuracy': 0, 'brand_accuracy': 0
}
)
pdf = pdf[pdf['origin'].isin(
['toutiao_test', 'ad_test', 'douyin_test', 'search_test'])]
# 返回多行
方法一:使用apply 的参数result_type 来处理
def formatrow(row):
a = row["a"] + str(row["cnt"])
b = str(row["cnt"]) + row["a"]
return a, b
df_tmp[["fomat1", "format2"]] = df_tmp.apply(formatrow, axis=1, result_type="expand")
df_tmp
a cnt fomat1 format2
data1 100 data1100 100data1
data2 200 data2200 200data2
————————————————
版权声明:本文为CSDN博主「赵孝正」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:blog.csdn.net/weixin_4671…
# merge 合并两个表格
df_1.merge(df_2,how='left',on='userid')
how: inner/left/right/outer
# dropna去掉有nan的行
pdf = pdf.dropna(subset=['origin_content'])
zhuanlan.zhihu.com/p/113972190
# isna
import pandas as pd
import numpy as np
pd.isna(1)
False
a = pd.DataFrame.from_dict({'key':['a'], 'value': [1]})
b = pd.DataFrame.from_dict({'key':['b'], 'value': [1]})
c = a.merge(b, on=['key'], how='outer')
c
key value_x value_y
0 a 1.0 NaN
1 b NaN 1.0
for row in c.iterrows():
... v = row[1]['value_x']
... print(pd.isna(v))
...
False
True
pd.isna(np.nan)
True
# 生成多个行
explode
explode这个爆炸方法只能处理列表、元组、Series和numpy的ndarray的类型
explode生成的列是没有顺序的,多次执行会不一样
对于字符串的格式
df[‘key’] = df[‘key’].str.split()先把key列变成表格
# astype可以用来转换某一行的类型
以下是一些使用示例:
df.index.astype('int64') # 索引类型转换
df.astype('int32') # 所有数据转换为int32
df.astype({'col1':'int32'}) # 指定字段转指定类型
s.astype('int64')
s.astype('int64',copy = False) # 不与原数据关联
df['name'].astype('object')
data['Q4'].astype('float')
s.astype('datatime64[ns]') # 转为时间类型
data['状态'].astype('bool')
————————————————
版权声明:本文为CSDN博主「山茶花开时。」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:blog.csdn.net/Hudas/artic…
pd.Datafrme()可以直接append()连接另一个pdf,默认是把列连接在一起
根据字段'material'进行分组,对字段'site'进行合并,内容之间用逗号(,)分隔,再进行去重处理;对字段'LT'取最大值,最终呈现结果如下所示
import pandas as pd
df = pd.DataFrame([['FJZ','A123',123],
['FOC','A123',456],
['FJZ','B456',112],
['FJZ','B456',245],
['FJZ','B456',110],
['FOC','C789',202],
['FOC','C789',205]
],columns=['site','material','LT'])
筛选字段'material'并进行去重处理
merge_data = df[['material']]
merge_data = merge_data.drop_duplicates(subset = ['material'])
对'site'和'LT'字段进行处理
df = df.groupby(['material']).agg({'site':[','.join],'LT':max})
更换字段栏位名称
new_column = ['site','LT']
df.columns = new_column
对字段'site'中的值进行去重处理
def data_deduplication(row):
data_list = row['site'].split(',')
res = ','.join(set(data_list))
return res
df['site'] = df.apply(lambda row:data_deduplication(row), axis=1)
merge_data = pd.merge(merge_data, df, how='left', on=['material'])
调整字段顺序
order = ['site','material','LT']
————————————————
版权声明:本文为CSDN博主「山茶花开时。」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:blog.csdn.net/Hudas/artic…
# to_csv quoting参数
有些字符串中含有\r字符,如果不加quoting=1,\r会导致换行,从而引起数据错位
- quoting : int, Controls whether quotes should be recognized. Values are taken from csv.QUOTE_* values. Acceptable values are 0, 1, 2, and 3 for QUOTE_MINIMAL, QUOTE_ALL, QUOTE_NONE, and QUOTE_NONNUMERIC,
respectively.
stackoverflow.com/questions/2…
pd.read_csv会对有null的列进行自动转换,整型会变为浮点数,null变为nan
添加keep_default_na=False,阻止自动类型转换
# Pandas.Series
Creating the Series
sr = pd.Series(['New York', 'Chicago', 'Toronto', 'Lisbon', 'Rio', 'Moscow'])
Create the Datetime Index
didx = pd.DatetimeIndex(start ='2014-08-01 10:00', freq ='W', periods = 6, tz = 'Europe/Berlin')
set the index
sr.index = didx
Print the series
print(sr)
ERROR:
数据写入一个字符串\r\r\rla challpe的时候,\r会起到换行的作用,从而导致多出来三行