在本文中,我们将带你了解将pandas数据框与关键重复项合并在这篇文章中,我们将为您详细介绍将pandas数据框与关键重复项合并的方方面面,并解答pandas重复值合并常见的疑惑,同时我们还将给您一些
在本文中,我们将带你了解将pandas数据框与关键重复项合并在这篇文章中,我们将为您详细介绍将pandas数据框与关键重复项合并的方方面面,并解答pandas重复值合并常见的疑惑,同时我们还将给您一些技巧,以帮助您实现更有效的Pandas数据分析-pandas数据框的多层索引、Pandas数据框多索引合并、Pandas数据框如何合并列、python – 如何将Pandas数据框中的多个列弹出到新的数据框中?。
本文目录一览:- 将pandas数据框与关键重复项合并(pandas重复值合并)
- Pandas数据分析-pandas数据框的多层索引
- Pandas数据框多索引合并
- Pandas数据框如何合并列
- python – 如何将Pandas数据框中的多个列弹出到新的数据框中?
将pandas数据框与关键重复项合并(pandas重复值合并)
我有2个数据框,两个数据框都有一个可能有重复的键列,但这些数据框大多具有相同的重复键。我想将这些数据帧合并到该键上,但是以这样的方式,当两个数据帧具有相同的重复项时,这些重复项将分别合并。另外,如果一个数据框比另一个数据框具有更多的重复键,我希望将其值填充为NaN。例如:
df1 = pd.DataFrame({''key'': [''K0'', ''K1'', ''K2'', ''K2'', ''K2'', ''K3''], ''A'': [''A0'', ''A1'', ''A2'', ''A3'', ''A4'', ''A5'']}, columns=[''key'', ''A''])df2 = pd.DataFrame({''B'': [''B0'', ''B1'', ''B2'', ''B3'', ''B4'', ''B5'', ''B6''], ''key'': [''K0'', ''K1'', ''K2'', ''K2'', ''K3'', ''K3'', ''K4'']}, columns=[''key'', ''B'']) key A0 K0 A01 K1 A12 K2 A23 K2 A34 K2 A45 K3 A5 key B0 K0 B01 K1 B12 K2 B23 K2 B34 K3 B45 K3 B56 K4 B6
我正在尝试获得以下输出
key A B0 K0 A0 B01 K1 A1 B12 K2 A2 B23 K2 A3 B36 K2 A4 NaN8 K3 A5 B49 K3 NaN B510 K4 NaN B6
因此,基本上,我想将重复的K2键视为K2_1,K2_2 …,然后在数据帧上进行how =’outer’合并。有什么想法我可以做到这一点吗?
答案1
小编典典再快一点
%%cython# using cython in jupyter notebook# in another cell run `%load_ext Cython`from collections import defaultdictimport numpy as npdef cg(x): cnt = defaultdict(lambda: 0) for j in x.tolist(): cnt[j] += 1 yield cnt[j]def fastcount(x): return [i for i in cg(x)]df1[''cc''] = fastcount(df1.key.values)df2[''cc''] = fastcount(df2.key.values)df1.merge(df2, how=''outer'').drop(''cc'', 1)
更快的答案; 不可扩展
def fastcount(x): unq, inv = np.unique(x, return_inverse=1) m = np.arange(len(unq))[:, None] == inv return (m.cumsum(1) * m).sum(0)df1[''cc''] = fastcount(df1.key.values)df2[''cc''] = fastcount(df2.key.values)df1.merge(df2, how=''outer'').drop(''cc'', 1)
旧答案
df1[''cc''] = df1.groupby(''key'').cumcount()df2[''cc''] = df2.groupby(''key'').cumcount()df1.merge(df2, how=''outer'').drop(''cc'', 1)
Pandas数据分析-pandas数据框的多层索引
前言
pandas数据框针对高维数据,也有多层索引的办法去应对。多层数据一般长这个样子
可以看到AB两大列,下面又有xy两小列。 行有abc三行,又分为onetwo两小行。
在分组聚合的时候也会产生多层索引,下面演示一下。
导入包和数据:
import numpy as np import pandas as pd df=pd.read_excel(''team.xlsx'')
分组聚合:
df.groupby([''team'',df.mean(1)>60]).count() #每组平均分大于60的人的个数
可以看到分为abcde五组,平均分大于60 的组员两小行。
创建多层索引
#序列中创建 arrays = [[1, 1, 2, 2], [''red'', ''blue'', ''red'', ''blue'']] index=pd.MultiIndex.from_arrays(arrays, names=(''number'', ''color'')) index
pd.DataFrame([{''a'':1, ''b'':2}], index=index)
#来自元组创建 arrays = [[''bar'', ''bar'', ''baz'', ''baz'', ''foo'', ''foo'', ''qux'', ''qux''], [''one'', ''two'', ''one'', ''two'', ''one'', ''two'', ''one'', ''two'']] tuples = list(zip(*arrays)) index = pd.MultiIndex.from_tuples(tuples, names=[''first'', ''second'']) pd.Series(np.random.randn(8), index=index)
#可迭代对象的笛卡尔积,排列组合各种情况 numbers = [0, 1, 2] colors = [''green'', ''purple''] index = pd.MultiIndex.from_product([numbers, colors],names=[''number'', ''color'']) pd.Series(np.random.randn(6), index=index)
#来自 DataFrame df = pd.DataFrame([[''bar'', ''one''], [''bar'', ''two''], [''foo'', ''one''], [''foo'', ''two'']], columns=[''first'', ''second'']) '''''' first second 0 bar one 1 bar two 2 foo one 3 foo two '''''' index = pd.MultiIndex.from_frame(df) pd.Series(np.random.randn(4), index=index)
多层索引操作
index_arrays = [[1, 1, 2, 2], [''男'', ''女'', ''男'', ''女'']] columns_arrays = [[''2020'', ''2020'', ''2021'', ''2021''], [''上半年'', ''下半年'', ''上半年'', ''下半年'',]] index = pd.MultiIndex.from_arrays(index_arrays,names=(''班级'', ''性别'')) columns = pd.MultiIndex.from_arrays(columns_arrays,names=(''年份'', ''学期'')) df = pd.DataFrame([(88,99,88,99),(77,88,97,98), (67,89,54,78),(34,67,89,54)],columns=columns, index=index) df
索引名称的查看
#索引名称的查看: df.index # 索引, 是一个 MultiIndex df.columns # 引索引,也是一个 MultiIndex # 查看行索引的名称 df.index.names # FrozenList([''班级'', ''性别'']) # 查看列索引的名称 df.columns.names # FrozenList([''年份'', ''学期''])
索引的层级
#索引的层级: df.index.nlevels # 层级数 2 df.index.levels # 行的层级 # FrozenList([[1, 2], [''女'', ''男'']]) df.columns.levels # 列的层级 # FrozenList([[''2020'', ''2021''], [''上半年'', ''下半年'']]) df[[''2020'',''2021'']].index.levels # 筛选后的层级 # FrozenList([[1, 2], [''女'', ''男'']])
索引内容的查看
#索引内容的查看: # 获取索引第2层内容 df.index.get_level_values(1) # Index([''男'', ''女'', ''男'', ''女''], dtype=''object'', name=''性别'') # 获取列索引第1层内容 df.columns.get_level_values(0) # Index([''2020'', ''2020'', ''2021'', ''2021''], dtype=''object'', name=''年份'') # 按索引名称取索引内容 df.index.get_level_values(''班级'') # Int64Index([1, 1, 2, 2], dtype=''int64'', name=''班级'') df.columns.get_level_values(''年份'') # Index([''2020'', ''2020'', ''2021'', ''2021''], dtype=''object'', name=''年份'') # 多层索引的数据类型,1.3.0+ df.index.dtypes
#排序
# 使用索引名可进行排序,可以指定具体的列 df.sort_values(by=[''性别'', (''2020'',''下半年'')]) df.index.reorder_levels([1,0]) # 等级顺序,互换 df.index.set_codes([1, 1, 0, 0], level=''班级'') # 设置顺序 df.index.sortlevel(level=0, ascending=True) # 按指定级别排序 df.index.reindex(df.index[::-1]) # 更换顺序,或者指定一个顺序
相关操作转换:
df.index.to_numpy() # 生成一个笛卡尔积的元组对列表 # array([(1, ''男''), (1, ''女''), (2, ''男''), (2, ''女'')], dtype=object) df.index.remove_unused_levels() # 返回没有使用的层级 df.swaplevel(0, 2) # 交换索引 df.to_frame() # 转为 DataFrame idx.set_levels([''a'', ''b''], level=''bar'') # 设置新的索引内容 idx.set_levels([[''a'', ''b'', ''c''], [1, 2, 3, 4]], level=[0, 1]) idx.to_flat_index() # 转为元组对列表 df.index.droplevel(0) # 删除指定等级 df.index.get_locs((2, ''女'')) # 返回索引的位置
数据查询
#查询指定行 df.loc[1] #一班的 df.loc[(1, ''男'')] # 一年级男 df.loc[1:2] # 一二两年级数据
#查询指定列 df[''2020''] # 整个一级索引下 df[(''2020'',''上半年'')] # 指定二级索引 df[''2020''][''上半年''] # 同上
#行列综合 slice(None)表示本层所有内容 df.loc[(1, ''男''), ''2020''] # 只显示2020年一年级男 df.loc[:, (slice(None), ''下半年'')] # 只看下半年的 df.loc[(slice(None), ''女''),:] # 只看女生 df.loc[1, (slice(None)),:] # 只看1班 df.loc[:, (''2020'', slice(None))] # 只看 2020 年的
#查询指定条件
#和单层索引的数据查询一样,不过在选择列上要按多层的规则。 df[df[(''2020'',''上半年'')] > 80]
#pd.IndexSlice切片使用: idx = pd.IndexSlice idx[0] # 0 idx[:] # slice(None, None, None) idx[0,''x''] # (0, ''x'') idx[0:3] # slice(0, 3, None) idx[0.1:1.5] # slice(0.1, 1.5, None) idx[0:5,''x'':''y''] # (slice(0, 5, None), slice(''x'', ''y'', None))
#查询应用: idx = pd.IndexSlice df.loc[idx[:,[''男'']],:] # 只显示男 df.loc[:,idx[:,[''上半年'']]] # 只显示上半年 #df.xs() df.xs((1, ''男'')) # 一年级男生 df.xs(''2020'', axis=1) # 2020 年 df.xs(''男'', level=1) # 所有男生
数据分组
df.groupby(level=0).sum() df.groupby(level=''性别'').sum() df.sum(level=''班级'') # 也可以直接统计
df.groupby(level=[''性别'', ''班级'']).sum()
到此这篇关于Pandas数据分析-andas数据框的多层索引的文章就介绍到这了,更多相关pandas多层索引内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!
- Pandas将列表(List)转换为数据框(Dataframe)
- Pandas 数据框增、删、改、查、去重、抽样基本操作方法
- pandas数据框,统计某列数据对应的个数方法
- python pandas创建多层索引MultiIndex的6种方式
- Pandas的MultiIndex多层索引使用说明
- pandas多层索引的创建和取值以及排序的实现
- 在Pandas中给多层索引降级的方法
Pandas数据框多索引合并
我想问一个关于在pandas中合并多索引数据框的问题,这是一个假设的场景:
arrays = [[''bar'', ''bar'', ''baz'', ''baz'', ''foo'', ''foo'', ''qux'', ''qux''], [''one'', ''two'', ''one'', ''two'', ''one'', ''two'', ''one'', ''two'']]tuples = list(zip(*arrays))index1 = pd.MultiIndex.from_tuples(tuples, names=[''first'', ''second''])index2 = pd.MultiIndex.from_tuples(tuples, names=[''third'', ''fourth''])s1 = pd.DataFrame(np.random.randn(8), index=index1, columns=[''s1''])s2 = pd.DataFrame(np.random.randn(8), index=index2, columns=[''s2''])
然后要么
s1.merge(s2, how=''left'', left_index=True, right_index=True)
要么
s1.merge(s2, how=''left'', left_on=[''first'', ''second''], right_on=[''third'', ''fourth''])
将导致错误。
我是否必须在任一s1 / s2上执行reset_index()才能使其工作?
谢谢
答案1
小编典典似乎您需要结合使用它们。
s1.merge(s2, left_index=True, right_on=[''third'', ''fourth''])#s1.merge(s2, right_index=True, left_on=[''first'', ''second''])
输出:
s1 s2bar one 0.765385 -0.365508 two 1.462860 0.751862baz one 0.304163 0.761663 two -0.816658 -1.810634foo one 1.891434 1.450081 two 0.571294 1.116862qux one 1.056516 -0.052927 two -0.574916 -1.197596
Pandas数据框如何合并列
我有一个如图所示的pandas数据框。我如何将其变成如下表所示。(演示是在excel中进行的,但我只想向您说明表的外观-这个问题与从excel导入和导出数据框无关)
谢谢
python – 如何将Pandas数据框中的多个列弹出到新的数据框中?
df = pd.DataFrame({'a':range(2),'b':range(2),'c':range(2),'d':range(2)})
我想从数据帧“弹出”两列(‘c’和’d’)到一个新的数据帧,在原始df中留下’a’和’b’.以下不起作用:
df2 = df.pop(['c','d'])
这是我的错误:
TypeError: '['c','d']' is an invalid key
有没有人知道一个快速,优雅的解决方案,除了做以下?
df2 = df[['c','d']] df3 = df[['a','b']]
我知道上面的代码输入并不是那么繁琐,但这就是DataFrame.pop发明的原因 – 在数据库中弹出一列时为我们省了一步.
解决方法
首先,切片df(步骤1),然后删除这些列(步骤2).
df2 = df[['c','d']].copy() del df[['c','d']] # df.drop(['c','d'],axis=1,inplace=True)
这是使用pd.concat的丑陋替代方案:
df2 = pd.concat([df.pop(x) for x in ['c','d']],1)
这仍然是一个两步过程,但你是在一行中完成的.
df a b 0 0 0 1 1 1 df2 c d 0 0 0 1 1 1
关于将pandas数据框与关键重复项合并和pandas重复值合并的介绍现已完结,谢谢您的耐心阅读,如果想了解更多关于Pandas数据分析-pandas数据框的多层索引、Pandas数据框多索引合并、Pandas数据框如何合并列、python – 如何将Pandas数据框中的多个列弹出到新的数据框中?的相关知识,请在本站寻找。
本文标签: