map与apply函数-日期-merge与concate—DataFrame.reindex/stack(看图) 多层行列索引(多条件索引)+转换

 为了方便自己使用以免忘记而写的。

 jupyter notebook取消缩进快捷键(取消缩进代码块):选中,然后Ctrl+[

 jupyter notebook用清华源安装库(直接换库名就行):

# 安装导入execl库,注意:使用外网连不上清华源
# !pip install xlwings -i https://pypi.tuna.tsinghua.edu.cn/simple
#或者库放在后面
#pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pyecharts==1.9.2

 # 保存csv、excel文件忽略索引:DataFrame.to_csv("",index=False)

#转成一维数组:y = np.array(j[j.columns].values).flatten()

#某列填充:datas['开关状态'].fillna('正常',inplace=True)

#去掉数据中的‘\t’空格
for columns_name in df_not.columns:
    df_not[columns_name] = df_not[columns_name].apply(lambda x: x.strip() if isinstance(x, str) else x)

目录

1. 常用数据处理  map函数 :

2. 常用数据处理  apply函数 应用于每个值 ,agg应用于每列的聚合函数

3. 重置行列索引:

4. 索引某列值对应的行,“ | ”表示“或”

 5. groupby:

 all_day = predict_true_data.groupby('日期').sum()

6. pd.merge()与pd.concat()

 7. 作图

8. 日期

9. filter() 过滤函数

10.遍历字典的键值

 11. reindex

12. DataFrame.rename修改行列索引

13. 使用index.map

 14. 获取多层索引的DataFrame值

 14.1 .loc[]多层索引

 14.2  根据多个行索引值选取值,法一:

 14.3 使用.loc[].loc[]逐层索引,要输入行索引值

14.4 swaplevel()  交换行索引的层级关系,并全部显示行索引值  +  .loc[]多层索引(‘行索引值’,‘列索引名’)

 15. 根据clomuns查询:

 15.1 根据外层column取值:

16. reset_index(): 将索引转化为列

 17. set_index(): 指定列为索引

 18. stack与unstack

 19. DataFrame—droplevel


提示:对于有多层索引的DataFrame,可以用.loc[]抽出一块DataFrame,再用.loc[]依次地抽出需要用到的DataFrame,不过对于大数据速度有点慢。

借用别人一张图片:

 参考网址:

https://blog.csdn.net/a321123b/article/details/121229832?spm=1001.2014.3001.5506


https://blog.csdn.net/Caiqiudan/article/details/122435560?spm=1001.2014.3001.5506


MultiIndex DataFrame多重索引的引用方法 https://blog.csdn.net/qq_30958667/article/details/126409737?spm=1001.2014.3001.5506

1. 常用数据处理  map函数 :

#从1开始序数编码
dicts_w1 = {}
dicts_w2 = {}

for i,j in enumerate(w1):
    dicts_w1[j]=i+1
for i,j in enumerate(w2):
    dicts_w2[j]=i+1

df_weather['天气状况1'] = df_weather['天气状况1'].map(dicts_w1)
df_weather['天气状况2'] = df_weather['天气状况2'].map(dicts_w2)
df_weather.head()

使用map()函数将列表中的每个元素平方
nums = [1, 2, 3, 4, 5]
squares =
map(lambda x: x**2, nums)

print(list(squares))  # 输出:[1, 4, 9, 16, 25]

2. 常用数据处理  apply函数 应用于每个值 ,agg应用于每列的聚合函数

#季节
def
date_to_season(month):
    if month in (3, 4, 5):
        return 0               #'春季'
    elif month in (6, 7, 8):
        return 1             #'夏季'
    elif month in (9, 10, 11):
        return 2            # '秋季'
    else:
        return 3               #'冬季'

df_new21['季节'] = df_new21['月'].apply(date_to_season)
df_new21.head()

——lambda函数

df['日期'] = df['数据时间'].apply(lambda x: x.split(" ")[0])

# 转时间序列:
df['数据时间'] = pd.to_datetime(df['数据时间'])

3. 重置行列索引:

 #重置列索引

df1.columns = ["新列名",........................"新列名"]

df4 = self.df1.rename(columns={'交易卡号': '账户开户卡号'})

#重置行索引,索引没有对应的值会为空
df1 = df1.reindex(index)

df_new21.index = df_new21['数据时间']          

index= pd.date_range(start='2018/1/1 00:00:00',end = '2021-08-31 23:45:00',freq="15T")
data = data.
reindex(index)

4. 索引某列值对应的行,“ | ”表示“或”

df_future_weather[(df_future_weather['日期'] == '2021-09-04') | (df_future_weather['日期'] == '2021-09-09')]

 5. groupby

 all_day = predict_true_data.groupby('日期').sum()

6. pd.merge()与pd.concat()

#左连节
datas = pd.merge(datas,df_word,on='数据时间',how='left')
datas.head()

`pd.merge()` 和 `pd.concat()` 是 Pandas 库中常用的数据合并函数。下面解析一下这两个函数的参数:

`pd.merge()` 函数的参数:
- `left`:左侧的数据框。
- `right`:右侧的数据框。
- `on`:指定用于合并的列名或列名列表。默认为 None。如果未指定,则会自动根据两个数据框中的列名进行合并。
- `how`:指定合并的方式。可选值为 'inner'、'outer'、'left'、'right'。默认为 'inner'。'inner' 表示内连接,只保留两个数据框中共有的行;'outer' 表示外连接,保留两个数据框中所有的行,并用 NaN 填充缺失值;'left' 表示左连接,保留左侧数据框中的所有行,并用 NaN 填充右侧数据框中的缺失值;'right' 表示右连接,保留右侧数据框中的所有行,并用 NaN 填充左侧数据框中的缺失值。
- `left_on`:左侧数据框中用于合并的列名或列名列表。默认为 None。
- `right_on`:右侧数据框中用于合并的列名或列名列表。默认为 None。
- `left_index`:是否使用左侧数据框的索引作为合并的依据。默认为 False。
- `right_index`:是否使用右侧数据框的索引作为合并的依据。默认为 False。

`pd.concat()` 函数的参数:
- `objs`:要合并的数据框、Series 或者 DataFrame 的列表。
- `axis`:指定合并的轴。默认为 0,表示沿着行方向进行合并;如果设置为 1,则表示沿着列方向进行合并。
- `join`:指定合并的方式。可选值为 'inner'、'outer'。默认为 'outer'。'inner' 表示内连接,只保留所有数据框中共有的列;'outer' 表示外连接,保留所有数据框中的列,并用 NaN 填充缺失值。
- `ignore_index`:是否忽略原始数据框的索引,并重新生成新的索引。默认为 False。
- `keys`:用于创建层次化索引的标签列表或数组。默认为 None。

希望以上解析对你有所帮助。

 7. 作图

colors=['#00FFFF','#FF3030']
bar_width = 0.4
plt.figure(figsize=(8,6))
for i,k in enumerate(dit_month.index):
    plt.bar(np.arange(12)+bar_width*i,dit_month.loc[k,:],width=0.3,label=k,color=colors[i])
plt.xticks(np.arange(12)+0.2,dit_month.columns,rotation=60)
# 添加标题和标签    
plt.title('不同销售点各月份总销售额')
plt.xlabel('月份')
plt.ylabel('销售额(万元)')
plt.legend()
plt.show()

import matplotlib.pyplot as plt

# 设置字体为SimHei
plt.rcParams['font.family'] = 'SimHei'

# 创建一个图形对象
ax = plt.gca()

# 隐藏图形对象的顶部和右侧边框
ax.spines['top'].set_color('None')
ax.spines['right'].set_color('None')

# 创建一个柱状图
data = {'购买周期1': 7, '购买周期2': 0, '购买周期3': 7}  # 假设有一个字典data,包含购买周期和数量
x = range(len(data))
y = list(data.values())
plt.bar(x, y, width=0.3)

# 设置x轴刻度标签
plt.xticks(x, data.keys())

# 添加柱状图标签
for i, v in enumerate(y):
    plt.text(i, v, str(v), ha='center', va='bottom')

# 添加x轴和y轴标签
plt.xlabel('购买周期')
plt.ylabel('数量')

# 显示图形
plt.show()

8. 日期

 转文本:     datas4['年月'] = datas4['日期'].dt.strftime("%y/%m")   "%Y/%m/%d"有完整年份  
datas4.head(1) 

 提取小时df['时间'] = pd.to_datetime(df['时间'], format='%H:%M').dt.time

在pandas中,`dt`是一个日期时间访问器(Datetime Accessor),它提供了一组方便的方法,用于在`Series`或`DataFrame`中处理日期时间数据。

`dt`访问器可以应用于`Series`对象的日期时间列,它使您能够轻松地访问和操作日期时间的各个组成部分,如年、月、日、小时、分钟、秒等。以下是一些常用的`dt`方法:

- `dt.year`:获取日期时间的年份。
- `dt.month`:获取日期时间的月份。
- `dt.day`:获取日期时间的日。
- `dt.hour`:获取日期时间的小时。
- `dt.minute`:获取日期时间的分钟。
- `dt.second`:获取日期时间的秒。
- `dt.weekday`:获取日期时间的星期几(0表示星期一,6表示星期日)。
- `dt.weekday_name`:获取日期时间的星期几的名称。
- `dt.strftime()`:将日期时间格式化为指定的字符串格式。

通过使用`dt`访问器,您可以方便地提取和操作日期时间的不同部分,进行日期时间的比较和筛选,以及将日期时间转换为不同的字符串格式。这对于数据分析和处理时间序列数据非常有用。

9. filter() 过滤函数

filter() 函数接收一个函数和一个可迭代对象作为参数,并返回一个新的可迭代对象,该对象包含所有使该函数返回 True 的元素。

# 使用filter()函数筛选出列表中的偶数
nums = [1, 2, 3, 4, 5]
evens = filter(lambda x: x % 2 == 0, nums)

print(list(evens))  # 输出:[2, 4]

10.遍历字典的键值

在Python中,可以使用for循环来遍历字典的键值。以下是两种常见的方法:

my_dict = {"key1": "value1", "key2": "value2", "key3": "value3"}
for key, value in my_dict.items():
    print(key, value)
my_dict = {"key1": "value1", "key2": "value2", "key3": "value3"}
for key in my_dict.keys():
    value = my_dict[key]
    print(key, value)

 11. reindex

reindex执行的是索引重组操作,接收一组标签序列作为新索引,既适用于行索引也适用于列标签名,重组之后索引数量可能发生变化,索引名为传入标签序列

rename执行的是索引重命名操作,接收一个字典映射或一个变换函数,也均适用于行列索引,重命名之后索引数量不发生改变,索引名可能发生变化

另外二者执行功能和接收参数的套路也是很为相近的,均支持两种变换方式:
一种是变换内容+axis指定作用轴(可选0/1或index/columns);
另一种是直接用index/columns关键字指定作用轴

#具体而言,reindex执行索引重组操作,以新接收的一组标签序列作为索引,
#当原DataFrame中存在该索引时则提取相应行或列,否则赋值为空或填充指定值。
#对于前面介绍的示例数据df,以重组行索引为例,
df2 = pd.DataFrame([('bird', 389.0),
                   ('bird', 24.0),
                   ('mammal', 80.5),
                   ('mammal', np.nan)],
                  index=['falcon', 'parrot', 'lion', 'monkey'],
                  columns=('class', 'max_speed'))
df2

#axis=0 按行索引 不能与index共用
df2.reindex(labels=['falcon','parrot'],axis=0)

# 按新的索引名索引,匹配原索引则显示值,不匹配则以空值或其他值填充
df2.reindex(labels=['falcon','parrot',1,2],axis=0)

df2.reindex(index=['falcon','parrot',1,2])

#以fill_value填充空值
df2.reindex(index=['falcon','parrot',1,2],fill_value='没有')

df2.reindex(labels=['falcon','parrot',1,2],axis=0,fill_value='没有')

df2

# 用method 进行填充,不行有问题

df2.index=(1,2,3,4)

df2.reindex(index=[1,2,3,6],method='ffill')

df2.fillna('a')

12. DataFrame.rename修改行列索引

pd.rename修改 (可修改部分索引)
Series.rename(index=None, *, axis=None, copy=True, inplace=False, level=None, errors=‘ignore’)

df2 = pd.DataFrame([('bird', 389.0),
                   ('bird', 24.0),
                   ('mammal', 80.5),
                   ('mammal', np.nan)],
                  index=['falcon', 'parrot', 'lion', 'monkey'],
                  columns=('class', 'max_speed'))
df2

#修改列索引名
df2.columns=['Class', 'Max_speed']
df2

#使用mapper+axis修改行索引
df2.rename(mapper={1:0},axis=0)

#使用匿名函数
df2.rename(index=lambda x:x+str('_1'))

df2.rename(index={'Falcon':'falcon', 'Parrot':'parrot', 'Lion':'lion', 'Monkey':'monkey'}, 
          columns={'Class':'class', 'Max_speed':'max_speed'}, inplace=True)
df2

13. 使用index.map

# 3. 使用index.map
针对DataFrame中的数据,pandas中提供了一对功能有些相近的接口:map和apply,以及applymap,其中map仅可用于DataFrame中的一列(也即即Series),可接收字典或函数完成单列数据的变换;apply既可用于一列(即Series)也可用于多列(即DataFrame),但仅可接收函数作为参数,当作用于Series时对每个元素进行变换,作用于DataFrame时对其中的每一行或每一列进行变换;而applymap则仅可作用于DataFrame,且作用对象是对DataFrame中的每个元素进行变换。也就是说,三者的最大不同在于作用范围以及变换方式的不同。

实际上,apply和map还有一个细微区别在于:同样是可作用于单列对象,apply适用于索引这种特殊的单列,而map则不适用。所以,对索引执行变换的另一种可选方式是用map函数,其具体操作方式与DataFrame常规map操作一致,接收一个函数作为参数即可:

def aggs(x):
    return x+'44'
df2.index.map(lambda x:aggs(x))

 

 14. 获取多层索引的DataFrame值

 提示:对于有多层索引的DataFrame,可以用.loc[]抽出一块DataFrame,再用.loc[]依次地抽出需要用到的DataFrame,不过对于大数据速度有点慢,输入的是行索引值,输入行索引名会报错

df = pd.DataFrame(np.random.randint(50, 100, size=(4, 4)), #任意生成4行4列50至100的整数
                  
                  columns=pd.MultiIndex.from_product(       #第一层列名['math', 'physics'],第二层['term1', 'term2']
                 [['math', 'physics'], ['term1', 'term2']]),  #'math'和 'physics'下分别都有['term1', 'term2']
                 
                  index=pd.MultiIndex.from_tuples(      #元组第一元素是第一层索引值,第二个元素是第二层索引值
                 [('class1', 'LiLei'), ('class2', 'HanMeiMei'),
                 ('class2', 'LiLei'), ('class2', 'HanMeiMei')]))
df

df.index.names = ['class', 'name']  #添加对应行索引值的行索引名
df

 14.1 .loc[]多层索引

df.loc[('class1','LiLei'),'math']  #必须是值('class1','LiLei'),行名会报错

# 取第一层索引值为'class1'的数据
df1 = df.loc['class1']
df1

 14.2  根据多个行索引值选取值,法一:

# 根据多个行索引值选取值,法一:
df.loc[('class2', 'HanMeiMei')]

 14.3 使用.loc[].loc[]逐层索引,要输入行索引值

#输入的是索引值
df.loc['class2'].loc['HanMeiMei']

14.4 swaplevel()  交换行索引的层级关系,并全部显示行索引值  +  .loc[]多层索引(‘行索引值’,‘列索引名’)

df.swaplevel()  ##交换行索引轴,默认 axis=0

df.swaplevel(axis=1)  #交换列索引轴

##交换列索引轴后索引某列
df.swaplevel(axis=1)['term1']

#根据行索引值索引
df.swaplevel().loc['HanMeiMei']

df.swaplevel().loc[('HanMeiMei','class2')]

df.swaplevel().loc[('HanMeiMei','class2'),'math']

df_s_loc = df.swaplevel().loc[('HanMeiMei','class2'),('math','term2')]
df_s_loc

 15. 根据clomuns查询:

 15.1 根据外层column取值:

 

 

 

 

16. reset_index(): 将索引转化为列

DataFrame.reset_index(level=None, drop=False, inplace=False, col_level=0, col_fill=’’)

level: 用于指定要将层次化索引的第几层转化为columns,第一个索引为0级,第二个为1级,默认为None(全部索引)。也可以用list的形式表示
drop: 是否删除索引列,默认False。
inplace: 是否修改原数据
col_level: 当有多列索引时,选取特定层级转换为列
col_fill: 当有多列索引时,确定转换为列的索引的名称

# 把行索引值全部显示出来,均转为列。行索引已更新
df.reset_index()

df.reset_index(level=0)

df.reset_index(level=1)

# 将某个行索引值转为一列值
df.reset_index('name')#['name']

#将多层行索引名设置为列
df.reset_index(['class','name'])

#将多层行索引名设置为列
df.reset_index(('class','name'))

 17. set_index(): 指定列为索引

DataFrame.set_index(keys, drop=True, append=False, inplace=False, verify_integrity=False)

keys: 设置为索引的列名,以list的形式表示 drop: 是否删除被设为索引的列,默认True(删除) append: 是否将新索引列附加到旧索引列上,默认False(不附加) inplace: 是否修改原数据,默认为False verify_integrity: 检查索引是否重复。默认False。

#指定某列为索引
df.set_index(('math','term1'))

# 也可以保留改索引的列
df.set_index(('math','term1'), drop=False)

#指定多列作为索引
df.set_index([('math','term1'),('math','term2')],drop=False)

# append: 是否将新索引列附加到旧索引列上,默认False(不附加)
df.set_index([('math','term1'),('math','term2')],drop=False,append=True)

 18. stack与unstack

这也是一对互逆的操作,其中stack原义表示堆叠,实现将所有列标签堆叠到行索引中;unstack即解堆,用于将复合行索引中的一个维度索引平铺到列标签中。实际上,二者的操作即是SQL中经典的行转列与列转行,也即在长表与宽表之间转换。

 

 

 

 19. DataFrame—droplevel

#删除行名'class'
df.droplevel('class')

df3 = pd.DataFrame([
     [1, 2, 3, 4],
     [5, 6, 7, 8],
     [9, 10, 11, 12]]).set_index([0, 1]).rename_axis(['a', 'b'])

df3.columns = pd.MultiIndex.from_tuples([
   ('c', 'e'), ('d', 'f')], names=['level_1', 'level_2'])
df3

df3.droplevel('level_2', axis=1)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
`pd.DataFrame.join()` 和 `pd.merge()` 是 Pandas 库中用于合并数据的两个函数,们之间有以下几个区别: 1. 对象类型:`join()` 是 DataFrame 和 Series 对象的方法,而 `merge()` 是 Pandas 中的一个函数。 2. 合并方式:`join()` 只能按照索引进行连接,而 `merge()` 可以按照指定的列进行连接。 3. 默认连接方式:`join()` 默认使用左连接(left join),即以调用 `join()` 方法的对象为基准进行连接,而 `merge()` 默认使用内连接(inner join),即只保留两个对象都存在的键。 4. 参数灵活性:`merge()` 函数提供了更多的参数选项,可以控制连接的方式、合并的列名、是否按索引连接等。而 `join()` 方法的参数选项相对较少,更适用于简单的索引连接操作。 5. 列名冲突处理:`join()` 方法在处理列名冲突时会自动添加后缀 `_x` 和 `_y` 来区分,而 `merge()` 函数提供了 `suffixes` 参数,可以自定义列名冲突时的后缀。 6. 返回结果:`join()` 方法返回一个新的 DataFrame,而 `merge()` 函数也返回一个新的 DataFrame,但可以通过设置 `inplace=True` 来直接在原始对象上进行合并操作。 根据以上区别,选择使用 `join()` 还是 `merge()` 取决于具体的需求。如果只需要按照索引进行连接操作,并且不需要过多的参数选项,可以使用 `join()` 方法。如果需要按照指定的列进行连接,并且需要更多的参数选项来控制连接方式和处理列名冲突等,可以使用 `merge()` 函数

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值