天道酬勤,学无止境

按列值熊猫连接数据框(Join dataframes by column values pandas)

问题

我有两个来自不同数据库的数据框df1df2 。 数据框中的每个项目都由id

df1 = pd.DataFrame({'id':[10,20,30,50,100,110],'cost':[100,0,300,570,400,140]})

df2 = pd.DataFrame({'id':[10,23,30,58,100,110],'name':['a','b','j','d','k','g']})

两个数据框中都有一些常见的产品,在这种情况下,ID 为 10,30,100,110 的产品。 我想将此信息合并到一个数据框中,如下所示:

df3 = pd.DataFrame({'id':[10,30,100,110],'name':['a','j','k','g'],'cost':[100,300,400,140]})

我试图用字典和嵌套循环来做这件事,但我处理了相当多的数据,而且这样做需要很长时间。

回答1

我认为你可以使用合并,默认参数how='inner'被省略:

print (pd.merge(df1,df2,on='id'))
   cost   id name
0   100   10    a
1   300   30    j
2   400  100    k
3   140  110    g

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 熊猫按列值拆分DataFrame(Pandas split DataFrame by column value)
    问题 我有带列Sales DataFrame 。 如何根据Sales价值将其分成2个? 第一个DataFrame将具有'Sales' < s ,第二个具有'Sales' >= s 回答1 您可以使用布尔索引: df = pd.DataFrame({'Sales':[10,20,30,40,50], 'A':[3,4,7,6,1]}) print (df) A Sales 0 3 10 1 4 20 2 7 30 3 6 40 4 1 50 s = 30 df1 = df[df['Sales'] >= s] print (df1) A Sales 2 7 30 3 6 40 4 1 50 df2 = df[df['Sales'] < s] print (df2) A Sales 0 3 10 1 4 20 也可以通过~反转mask : mask = df['Sales'] >= s df1 = df[mask] df2 = df[~mask] print (df1) A Sales 2 7 30 3 6 40 4 1 50 print (df2) A Sales 0 3 10 1 4 20 print (mask) 0 False 1 False 2 True 3 True 4 True Name: Sales, dtype: bool print (~mask) 0 True 1
  • 熊猫按列值排名[重复](Pandas rank by column value [duplicate])
    问题 这个问题已经在这里有了答案: 熊猫按年份分组,按销售额列排名,在具有重复数据的数据框中(1个答案) 5年前关闭。 我有一个包含拍卖ID和出价的数据框。 数据框按拍卖ID(升序)和出价(降序)排序: Auction_ID Bid_Price 123 9 123 7 123 6 123 2 124 3 124 2 124 1 125 1 我想添加一个名为“ Auction_Rank”的列,该列按竞价对拍卖ID进行排名: Auction_ID Bid_Price Auction_Rank 123 9 1 123 7 2 123 6 3 123 2 4 124 3 1 124 2 2 124 1 3 125 1 1 回答1 这是在熊猫路上做的一种方法 您可以在Auction_ID上进行Auction_ID并在Bid_Price以ascending=False进行rank() In [68]: df['Auction_Rank'] = df.groupby('Auction_ID')['Bid_Price'].rank(ascending=False) In [69]: df Out[69]: Auction_ID Bid_Price Auction_Rank 0 123 9 1 1 123 7 2 2 123 6 3 3 123 2 4 4 124 3 1 5 124 2 2 6
  • Pandas:连接数据框并保留重复的索引(Pandas: Concatenate dataframe and keep duplicate indices)
    问题 我有两个数据框,我想将它们按列(轴 = 1)与内部连接连接起来。 其中一个数据帧有一些重复的索引,但行不是重复的,我不想丢失这些数据: df1 = pd.DataFrame([{'a':1,'b':2},{'a':1,'b':3},{'a':2,'b':4}], columns = ['a','b']).set_index('a') df2 = pd.DataFrame([{'a':1,'c':5},{'a':2,'c':6}],columns = ['a','c']).set_index('a') >>> df1 b a 1 2 1 3 2 4 8 9 >>> df2 c a 1 5 2 6 默认的concat行为是用 NaN 填充缺失值: >>> pd.concat([df1,df2]) b c a 1 2 NaN 1 3 NaN 2 4 NaN 1 NaN 5 2 NaN 6 我想保留来自 df1 的重复索引并用来自 df2 的重复值填充它们,但在 Pandas 0.13.1 中,列上的内部连接会产生错误。 在最新版本的熊猫 concat 做我想要的: >>> pd.concat([df1, df2], axis=1, join='inner') b c a 1 2 5 1 3 5 2 4 6 达到我想要的结果的最佳方法是什么? 有groupby解决方案吗?
  • 有条件地设置熊猫数据框列值(Conditionally set pandas dataframe column values)
    问题 这个问题和下面的要求完全一样,还有一个转折点, Pandas:替换数据框中的列值 pandas 数据框列中值的条件替换 所以,我想设置或有条件地设置熊猫数据框列值。 增加的复杂性是,我需要用变量( df[var_for_data1] )来寻址它们,而不是用字符串常量( df['data1'] )来寻址数据帧列,因为我的df列名称是构建的。 这是一个非常简单的例子来解释我想要什么: df = pd.DataFrame({'data1': np.random.randn(100),'data2': np.random.randn(100)}) print(df.head()) Col = 'data1' print(df[Col].head()) df.data1 = df.data1 +.1 print(df[Col].head()) # so far so good, now how to do above with variable dataframe column name `Col` #df.Col = df.Col + .1 问题出在代码中,到目前为止一切顺利,现在如何使用可变数据框列名Col进行上述操作。 下一个问题是如何在上面的赋值中添加一个条件,比如if df.data1 >=.25 and df.data1 <= .35: 。 当然
  • 如何按列值对数据框进行排序?(How to sort data frame by column values?)
    问题 我对 python 和 pandas 数据框比较陌生,所以也许我在这里错过了一些很容易的东西。 所以我有很多行和列的数据框,但最后终于设法从每一列中获得最大值的一行。 我用这个代码来做到这一点: import pandas as pd d = {'A' : [1.2, 2, 4, 6], 'B' : [2, 8, 10, 12], 'C' : [5, 3, 4, 5], 'D' : [3.5, 9, 1, 11], 'E' : [5, 8, 7.5, 3], 'F' : [8.8, 4, 3, 2]} df = pd.DataFrame(d, index=['a', 'b', 'c', 'd']) print df Out: A B C D E F a 1.2 2 5 3.5 5.0 8.8 b 2.0 8 3 9.0 8.0 4.0 c 4.0 10 4 1.0 7.5 3.0 d 6.0 12 5 11.0 3.0 2.0 然后从每列中选择最大值,我使用了这个函数: def sorted(s, num): tmp = s.order(ascending=False)[:num] tmp.index = range(num) return tmp NewDF=df.apply(lambda x: sorted(x, 1)) print NewDF Out: A B C D
  • 用另一个数据框的值替换一个数据框的列值(replace column values in one dataframe by values of another dataframe)
    问题 我有两个数据框,第一个有1000行,看起来像: Date Group Family Bonus 2011-06-09 tri23_1 Laavin 456 2011-07-09 hsgç_T2 Grendy 679 2011-09-10 bbbj-1Y_jn Fantol 431 2011-11-02 hsgç_T2 Gondow 569 “ Group ”列具有不同的值,有时会重复,但通常大约有50个唯一值。 第二个数据框包含所有这50个唯一值(50行)以及与这些值关联的酒店: Group Hotel tri23_1 Jamel hsgç_T2 Frank bbbj-1Y_jn Luxy mlkl_781 Grand Hotel vchs_94 Vancouver 我的目标是用第二个数据帧的Hotel列的相应值替换第一个数据帧的Group列中的值/或用相应的值创建Hotel列。 当我尝试通过分配来完成它时 df1.loc[(df1.Group=df2.Group), 'Hotel']=df2.Hotel 我有一个错误,即数据帧的大小不相等,因此无法进行比较 回答1 如果将索引设置为另一个df的“组”列,则可以使用原始df的“组”列上的map进行替换: In [36]: df['Group'] = df['Group'].map(df1.set_index('Group')[
  • 减少熊猫数据框中闰年的列值(Reduce column values for leap years in pandas dataframe)
    问题 I have a dataframe of the foll. form: datetime JD YEAR 2000-01-01 1 2000 2000-01-02 2 2000 2000-01-03 3 2000 2000-01-04 4 2000 2000-01-05 5 2000 2000-01-06 6 2000 2000-01-07 7 2000 2000-01-08 8 2000 2000-01-09 9 2000 ... 2010-12-31 365 2014 The JD value is the julian day i.e it starts at 1 on Jan 1st of each year (going upto 366 for leap years and 365 for others). I would like to reduce the JD value by 1, for each day starting on Feb 29th of each leap year. JD values should not be changed for non-leap years. Here is what I am doing right now: def reduce_JD(row): if calendar.isleap(row.YEAR)
  • 在熊猫中建立索引的意义是什么?(What is the point of indexing in pandas?)
    问题 有人可以指出我的链接或提供对熊猫索引的好处的解释吗? 我通常会处理表并根据列将它们连接起来,这种连接/合并过程似乎仍然会对索引进行重新索引,因此考虑到我认为不需要,应用索引标准有点麻烦。 关于索引的最佳做法有什么想法? 回答1 像字典一样,DataFrame的索引由哈希表支持。 基于索引值查找行就像基于键查找字典值。 相反,列中的值类似于列表中的值。 基于索引值查找行比基于列值查找行要快。 例如,考虑 df = pd.DataFrame({'foo':np.random.random(), 'index':range(10000)}) df_with_index = df.set_index(['index']) 这是查找df['index']列等于999的任何行的方式。Pandas必须遍历该列中的每个值以找到等于999的那些值。 df[df['index'] == 999] # foo index # 999 0.375489 999 这是查找索引等于999的任何行的方式。通过索引,Pandas使用哈希值查找行: df_with_index.loc[999] # foo 0.375489 # index 999.000000 # Name: 999, dtype: float64 按索引查找行比按列值查找行快得多: In [254]: %timeit df[df[
  • 根据列值而不是索引值从熊猫数据框中排除行(excluding rows from a pandas dataframe based on column value and not index value)
    问题 我查看了数据框列中的唯一值-我拥有的熊猫。 而且我不想在其中一列中包含一些名称,如何在不使用索引值表示法的情况下从数据框中删除这些行,而是通过说出如果row value =“ this”然后删除 喜欢... new = df.copy df['some column'].drop_values('this','that','other') 回答1 请参见使用isin进行索引(也可以是布尔索引): mask = df['some column'].isin(['this', 'that', 'other']) df[~mask]
  • 熊猫合并101(Pandas Merging 101)
    问题 如何执行( INNER |( LEFT | RIGHT | FULL ) OUTER ) JOIN有熊猫吗? 合并后如何为缺失的行添加NaN? 合并后如何去除NaN? 我可以合并索引吗? 如何合并多个DataFrame? 与大熊猫交叉联接? merge ? join ? concat ? update ? 谁? 什么? 为什么?! ... 和更多。 我已经看到这些重复出现的问题,询问有关熊猫合并功能的各个方面。 如今,有关合并及其各种用例的大多数信息都分散在数十个措辞不好,无法搜索的帖子中。 这里的目的是整理后代的一些更重要的观点。 本QnA旨在成为有关大熊猫习语的一系列有用的用户指南的下一部分(请参阅有关枢轴的文章和有关串联的文章,我将在稍后进行讨论)。 请注意,本文并非是文档的替代品,因此也请阅读! 一些示例是从那里获取的。 目录 为了易于访问。 合并基础-联接的基本类型(请首先阅读) 基于索引的联接泛化为多个DataFrame 交叉联接 回答1 这篇文章旨在为读者提供有关SQL风味的与熊猫的合并,使用方法以及何时不使用它的入门。 特别是,这是这篇文章的内容: 基础-联接类型(左,右,外,内) 与不同的列名称合并与多列合并避免在输出中出现重复的合并键列 该帖子(以及我在该主题上发布的其他帖子)将不会通过以下内容: 与性能相关的讨论和时间安排(目前)。 在适当的地方
  • Matplotlib中按列值着色(Color by Column Values in Matplotlib)
    问题 我在R中使用ggplot2库的最喜欢的方面之一是能够轻松指定美观。 我可以快速创建散点图并应用与特定列关联的颜色,我希望能够使用python / pandas / matplotlib做到这一点。 我想知道人们是否使用任何便利功能来使用pandas数据框和Matplotlib将颜色映射到值? ##ggplot scatterplot example with R dataframe, `df`, colored by col3 ggplot(data = df, aes(x=col1, y=col2, color=col3)) + geom_point() ##ideal situation with pandas dataframe, 'df', where colors are chosen by col3 df.plot(x=col1,y=col2,color=col3) 编辑:谢谢您的答复,但我想提供一个示例数据框来阐明我的要求。 两列包含数值数据,第三列是分类变量。 我正在考虑的脚本将基于此值分配颜色。 import pandas as pd df = pd.DataFrame({'Height':np.random.normal(10), 'Weight':np.random.normal(10), 'Gender': ["Male","Male","Male"
  • 如何删除熊猫数据框中具有重复列值的行?(how do I remove rows with duplicate values of columns in pandas data frame?)
    问题 我有一个看起来像这样的熊猫数据框。 Column1 Column2 Column3 0 cat 1 C 1 dog 1 A 2 cat 1 B 我想确定cat和bat是重复的相同值,因此要删除一个记录并仅保留第一条记录。 结果数据帧应该只有一个。 Column1 Column2 Column3 0 cat 1 C 1 dog 1 A 回答1 使用drop_duplicates及其带有列列表的subset来检查重复项,并使用keep='first'保留重复项的第一个。 如果dataframe是: df = pd.DataFrame({'Column1': ["'cat'", "'toy'", "'cat'"], 'Column2': ["'bat'", "'flower'", "'bat'"], 'Column3': ["'xyz'", "'abc'", "'lmn'"]}) print(df) 结果: Column1 Column2 Column3 0 'cat' 'bat' 'xyz' 1 'toy' 'flower' 'abc' 2 'cat' 'bat' 'lmn' 然后: result_df = df.drop_duplicates(subset=['Column1', 'Column2'], keep='first') print(result_df) 结果:
  • 使用字典替换熊猫数据框上给定索引号上的列值(Using a dictionary to replace column values on given index numbers on a pandas dataframe)
    问题 考虑以下数据框 df_test = pd.DataFrame( {'a' : [1, 2, 8], 'b' : [np.nan, np.nan, 5], 'c' : [np.nan, np.nan, 4]}) df_test.index = ['one', 'two', 'three'] 这使 a b c one 1 NaN NaN two 2 NaN NaN three 8 5 4 我有b和c列的行替换字典。 例如: { 'one': [3.1, 2.2], 'two' : [8.8, 4.4] } 其中3.1和8.8替换了列b,而2.2和4.4替换了列c,因此结果为 a b c one 1 3.1 2.2 two 2 8.8 4.4 three 8 5 4 我知道如何使用for循环进行这些更改: index_list = ['one', 'two'] value_list_b = [3.1, 8.8] value_list_c = [2.2, 4.4] for i in range(len(index_list)): df_test.ix[df_test.index == index_list[i], 'b'] = value_list_b[i] df_test.ix[df_test.index == index_list[i], 'c'] = value_list_c
  • 熊猫groupby而不将按列分组变成索引(pandas groupby without turning grouped by column into index)
    问题 pandas groupby的默认行为是将group by列转换为index并将其从数据框的列列表中删除。 例如,说我有一个包含这些列的dataFrame col1|col2|col3|col4 如果我以这种方式对列col2和col3应用groupby说 df.groupby(['col2','col3']).sum() 数据框df在列列表中不再具有['col2','col3'] 。 它们将自动转换为结果数据帧的索引。 我的问题是如何对列执行groupby并将该列保留在数据框中? 回答1 df.groupby(['col2','col3'], as_index=False).sum() 回答2 另一种方法是: df.groupby(['col2', 'col3']).sum().reset_index() 回答3 不确定,但是我认为正确的答案是 df.groupby(['col2','col3']).sum() df = df.reset_index() 至少我一直在努力避免使用具有多索引的数据帧。 回答4 添加了以下稍微详细的答案,以帮助仍对使用哪种答案感到困惑的人。 首先,针对此问题建议的两种解决方案是: 解决方案1 : df.groupby(['col2', 'col3'], as_index=False).sum() 解决方案2 : df.groupby(['col2
  • 如何按列裁剪熊猫数据框?(how to clip pandas dataframe column-wise?)
    问题 我有 In [67]: a Out[67]: 0 1 2 0 1 2 3 1 4 5 6 当我跑 In [69]: a.clip(lower=[1.5,2.5,3.5],axis=1) 我有 ValueError: other must be the same shape as self when an ndarray 这是预期的吗? 我期待得到类似的东西: Out[72]: 0 1 2 0 1.5 2.5 3.5 1 4.0 5.0 6.0 回答1 您可以使用 Series 代替 numpy 数组,以便对齐标签: df Out: A B 0 1 4 1 2 5 2 3 6 df.clip(lower=pd.Series({'A': 2.5, 'B': 4.5}), axis=1) Out: A B 0 2.5 4.5 1 2.5 5.0 2 3.0 6.0 回答2 下:浮点数或array_like,默认无 根据 API 参考,您应该使用相同形状的数组。 import numpy as np import pandas as pd ... print df.shape (2, 3) print df.clip(lower=(df.clip(lower=(np.array([[n+1.5 for n in range(df.shape[1])] for _ in range
  • 按索引合并两个数据框(Merge two dataframes by index)
    问题 我有以下数据框: > df1 id begin conditional confidence discoveryTechnique 0 278 56 false 0.0 1 1 421 18 false 0.0 1 > df2 concept 0 A 1 B 如何合并索引以获取: id begin conditional confidence discoveryTechnique concept 0 278 56 false 0.0 1 A 1 421 18 false 0.0 1 B 我问是因为我的理解是merge()即df1.merge(df2)使用列来进行匹配。 实际上,这样做我得到: Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/usr/local/lib/python2.7/dist-packages/pandas/core/frame.py", line 4618, in merge copy=copy, indicator=indicator) File "/usr/local/lib/python2.7/dist-packages/pandas/tools/merge.py", line 58, in merge copy=copy
  • 通过列值复制熊猫数据框中的行(Replicating rows in a pandas data frame by a column value)
    问题 我想在Pandas Dataframe中复制行。 每行应重复n次,其中n是每行的一个字段。 import pandas as pd what_i_have = pd.DataFrame(data={ 'id': ['A', 'B', 'C'], 'n' : [ 1, 2, 3], 'v' : [ 10, 13, 8] }) what_i_want = pd.DataFrame(data={ 'id': ['A', 'B', 'B', 'C', 'C', 'C'], 'v' : [ 10, 13, 13, 8, 8, 8] }) 这可能吗? 回答1 您可以使用np.repeat来获取重复的索引,然后使用它来索引帧: >>> df2 = df.loc[np.repeat(df.index.values,df.n)] >>> df2 id n v 0 A 1 10 1 B 2 13 1 B 2 13 2 C 3 8 2 C 3 8 2 C 3 8 之后,只需清理一下即可: >>> df2 = df2.drop("n",axis=1).reset_index(drop=True) >>> df2 id v 0 A 10 1 B 13 2 B 13 3 C 8 4 C 8 5 C 8 请注意,如果您可能有重复的索引.iloc担心,则可以改用.iloc : In [86]: df
  • 在列和索引的值上对Pandas DataFrame进行排序?(Sort pandas dataframe both on values of a column and index?)
    问题 通过列的值和索引对pandas数据框进行排序是否可行? 如果按列的值对pandas数据框进行排序,则可以按列对得到的数据框进行排序,但是不幸的是,您看到的数据框索引的顺序在相同的排序列中是乱七八糟的。 那么,我可以按列对数据框进行排序吗,例如名为count的列,也可以按index的值对其进行排序? 并且按降序对列进行排序而按升序对索引进行排序也是可行的吗? 我知道如何对数据帧中的多个列进行排序,也知道我可以通过首先对索引进行reset_index()并将其排序,然后再次创建索引来实现我的要求。 但是,这样做更直观,更有效吗? 回答1 熊猫0.23终于让您到达了:-D 现在,您可以将索引名称(不仅是列名称)作为参数传递给sort_values 。 因此,这种单线工作原理是: df = df.sort_values(by = ['MyCol', 'MyIdx'], ascending = [False, True]) 如果您的索引当前未命名: df = df.rename_axis('MyIdx').sort_values(by = ['MyCol', 'MyIdx'], ascending = [False, True]) 回答2 在熊猫0.23+中,您可以直接进行操作-参见OmerB的答案。 如果您还没有0.23+,请继续阅读。 我敢冒险说,最简单的方法是将索引复制到列中
  • 熊猫中merge()和concat()之间的差异(Difference(s) between merge() and concat() in pandas)
    问题 pd.DataFrame.merge()和pd.concat()之间的本质区别是什么? 到目前为止,这是我发现的结果,请评论我的理解是多么完整和准确: .merge()只能使用列(加上行索引),并且在语义上适合于数据库样式的操作。 .concat()可以与任一轴一起使用,仅使用索引,并提供添加分层索引的选项。 附带地,这允许以下冗余:两者都可以使用行索引来组合两个数据帧。 pd.DataFrame.join()仅仅是提供了一个速记的用例的一个子集.merge() (Pandas擅长解决数据分析中的各种用例。探索文档以找出执行特定任务的最佳方法可能有些艰巨。) 回答1 一个非常高的差异是, merge()用于基于公共列的值组合两个(或多个)数据帧(也可以使用索引,使用left_index=True和/或right_index=True ),以及concat()用于将一个(或多个)数据帧一个接一个地附加在另一个数据帧(或横向放置,具体取决于axis选项设置为0还是1)上。 join()用于根据索引合并2个数据帧; 代替使用带有选项left_index=True merge() ,我们可以使用join() 。 例如: df1 = pd.DataFrame({'Key': ['b', 'b', 'a', 'c', 'a', 'a', 'b'], 'data1': range(7)})
  • 连接熊猫数据框中的所有列(Concatenate all columns in a pandas dataframe)
    问题 我有多个 Pandas 数据框,它们可能有不同的列数,这些列的数量通常从 50 到 100 不等。我需要创建一个简单地连接所有列的最后一列。 基本上列第一行中的字符串应该是所有列第一行上字符串的总和(串联)。 我写了下面的循环,但我觉得可能有更好更有效的方法来做到这一点。 关于如何做到这一点的任何想法 num_columns = df.columns.shape[0] col_names = df.columns.values.tolist() df.loc[:, 'merged'] = "" for each_col_ind in range(num_columns): print('Concatenating', col_names[each_col_ind]) df.loc[:, 'merged'] = df.loc[:, 'merged'] + df[col_names[each_col_ind]] 回答1 sum 的解决方案,但输出是float ,因此转换为int和str是必要的: df['new'] = df.sum(axis=1).astype(int).astype(str) 另一个apply函数join解决方案,但它是最慢的: df['new'] = df.apply(''.join, axis=1) 最后一个非常快的numpy solution -