1、如何避免SettingWithCopyWarning
2、pandas数据排序
3、字符串处理
4、pandas的axis参数的理解
5、pandas的index索引的理解
6、pandas的merge归并dataFrame简介
7、pandas的concat合并dataFrame简介
这里续(上)的内容
1、如何避免SettingWithCopyWarning
def pandas_warn_deal():
df = pd.read_excel("./testData.xlsx", skiprows=2)
# 发出警告代码df[condition]['number']=df['number1']-number['number2']
# 相关于df.get(condition).set(number)第一步的get发出警告
# !!pandas的dataFrame的修改写操作,只允许在源dataFrame上进行,一步到位
# 正确的写法,改为set一步操作
condition = "your condition"
df.loc[condition, "number"] = df['number1'] - df['number2']
df[condition].head() # 运行以后不报错
# 解决方案二
# 如果需要预筛选数据做后续的处理分析,使用copy复制dataFrame
dfCopy = df[condition].copy()
# 在新的dataFrame上操作
dfCopy = df['number1'] - df['number2']
dfCopy.head() # 运行后不报错
# !! 总之,pandas不允许先筛选dataframe,再进行修改写入
2、pandas数据排序
def pandas_sort_data():
df = pd.read_csv('./tips.csv')
# series的排序,适用于数字和文字
# print(df['total_bill'].sort_values()) # 默认升序排列
# print(df['total_bill'].sort_values(ascending=False)) # 降序排列
# dataframe的排序
print(df.sort_values(by="total_bill")) # 以该键名为索引排序,默认升序排列
print(df.sort_values(by="total_bill", ascending=False)) # 以该键名为索引排序,降序排列
# 多列排序
# 按多个列来排序,默认升序
print(df.sort_values(by=['total_bill', 'size']))
# 全按降序
print(df.sort_values(by=['total_bill', 'size'], ascending=False))
# 分别按不同排序
print(df.sort_values(by=['total_bill', 'size'], ascending=[True, False]))
3、字符串处理
def pandas_deal_string():
df = pd.read_csv('./tips.csv')
# 参考series的str属性
print(df["sex"].str) # 类型StringMethods
# 替换
print(df['sex'].str.replace("male", "男"))
# 参考该数据类型是不是数字
print(df['sex'].str.isnumeric()) # 结果为False
# !!该数据类型不内用len()方法查看长度
# 使用str的startswith、contains等得到的bool可以做条件查询
condition = df['sex'].str.startswith('Female')
print(condition) # 返回True or False的Series对象
print(df[condition].head()) # 通过该series对象可以条件查询
# 需要多次str处理的链式操作
# 每次调用都会返回一个新的Series
print(df['sex'].str.replace("e", "").str.slice(0, 3)) # slice是str的方法
# 相当于
print(df['sex'].str.replace("e", "").str[0:3]) # 切片
# 使用正则表达式处理
# 添加新列
def gain_sex(x):
a, b = x['sex'].split("a")
return f"{a}和{b}两"
df['sex2'] = df.apply(gain_sex, axis=1)
print(df['sex2'])
# 方法1:链式replace
df['sex2'].str.replace('和', "a").str.replace("两", "a")
# 方法2:相当于 正则
df['sex2'].str.replace("[和两]", "a")
4、pandas的axis参数的理解
def pandas_axis():
import numpy as np
df = pd.DataFrame(
np.arange(12).reshape(3, 4),
columns=['A', 'B', 'C', 'D']
)
# 删除某列
df.drop('A', axis=1)
# 删除某行
df.drop(1, axis=0)
# 求行的平均值
# axis=0 or axis=index
# 因为指定运动的是行的axis所以按行位置运动变量,最后输出一列数据
df.mean(axis=0)
# axis=1 or axis=columns
# 因为指定运动的是列的axis所以按列位置运动变量,最后输出一行数据
df.mean(axis=1)
5、pandas的index索引的理解
def pandas_index():
df = pd.read_csv('./tips.csv')
#inplace=True表示修改当前数据列,drop=False让索引还保持在column里
#以该字段为索引
df.set_index("total_bill",inplace=True,drop=False)
print(df)#可以看到索引变成了total_bill,并且该列还在dataframe里
print(df.index)#索引也改变为该字段
#使用index的查询方法
print(df.loc[21.01].head(5))#loc里的为索引的值
#使用column的condition查询方法
print(df.loc[df['total_bill']==21.01].head())#效果类似
#使用索引可以提升查询性能
6、pandas的merge归并dataFrame简介
def pandas_merge():
# 这里只介绍最直观的写法
import numpy as np
df = pd.DataFrame(np.arange(12).reshape(3, 4),
columns=['A', 'B', 'C', 'D'])
df2 = pd.DataFrame(np.arange(12, 24).reshape(3, 4),
columns=['A', 'E', 'G', 'H'])
print(df)
print(df2)
df3 = pd.merge(df, df2, on='A', how='outer')
print(df3)
df4 = pd.merge(df, df2, left_on='A', right_on='E', how='inner')
print(df4)
df5=pd.merge(df,df2,how='left')
print(df5)
# 另外how还可以为inner、right、outer、left默认为inner
7、pandas的concat合并dataFrame简介
def pandas_concat():
df = pd.DataFrame({
'A': ['A0', 'A1', 'A2', 'A3'],
'B': ['B0', 'B1', 'B2', 'B3'],
'C': ['C0', 'C1', 'C2', 'C3'],
'D': ['D0', 'D1', 'D2', 'D3'],
'E': ['E0', 'E1', 'E2', 'E3']
})
df2 = pd.DataFrame({
'A': ['A4', 'A5', 'A6', 'A7'],
'B': ['B4', 'B5', 'B6', 'B7'],
'C': ['C4', 'C5', 'C6', 'C7'],
'D': ['D4', 'D5', 'D6', 'D7'],
'F': ['F4', 'F5', 'F6', 'F7']
})
# 默认的concat,参数为axis=0,join="outer",ignore_index=False
print(pd.concat([df, df2]))
# 按列来拼接
s1 = pd.Series(list(range(4)), name="F")
print(pd.concat([df, s1], axis=1))
# 添加多列的Series
s2 = df.apply(lambda x: x['A'] + "_GG", axis=1)
# 该s2设置一个键名
s2.name = 'G'
print(pd.concat([df, s1, s2], axis=1))
# 列表可以只有series
print(pd.concat([s1, s2], axis=1))
# 列表也可以混合排列
print(pd.concat([s1, df, s2], axis=1))
# append函数
# 给dataframe添加另一个dataframe
print(df.append(df2, ignore_index=True)) # True忽略原来索引
# 可以一行一行的给dataframe添加数据
# 一个空的df3
df3 = pd.DataFrame(columns=['A'])
# 低性能版本
for i in range(5):
# 注意这里每次都在复制
df3 = df3.append({'A': i}, ignore_index=True)
print(df3)
# 高性能版本,推荐使用
# 第一个入参是一个列表,避免了多次复制
df3 = pd.concat(
[pd.DataFrame([i], columns=['A']) for i in range(5)],
ignore_index=True
)
print(df3)
更多详细用法查看官方文档:http://www.pypandas.cn/docs/reference.html