LEFT| RIGHT| FULL)(INNER| OUTER)连接?merge?join?concat?update?谁?什么?为什么?!... 和更多.我已经看到了这些反复出现的问题,询问了pandas合并功能的各个方面.今天关于合并及其各种用例的大部分信息在几十个措辞严厉,不可搜索的帖子中都是分散的.这里的目的是为后代整理一些更重要的观点.
这个QnA应该是关于常见熊猫习语的一系列有用的用户指南的下一部分(参见关于转动的这篇文章,以及关于连接的这篇文章,我将在稍后介绍).
请注意,这篇文章并不是文档的替代品,所以请阅读它!一些例子来自那里.
我正在使用Python 3.2.试过这个:
xor = lambda x,y: (x+y)%2
l = reduce(xor, [1,2,3,4])
Run Code Online (Sandbox Code Playgroud)
并得到以下错误:
l = reduce(xor, [1,2,3,4])
NameError: name 'reduce' is not defined
Run Code Online (Sandbox Code Playgroud)
尝试打印reduce到交互式控制台 - 出现此错误:
NameError: name 'reduce' is not defined
Run Code Online (Sandbox Code Playgroud)
是reduce在Python 3.2真的删除?如果是这样的话,还有什么选择呢?
我有不同的数据帧,需要根据日期列将它们合并在一起.如果我只有两个数据帧,我可以使用df1.merge(df2, on='date')它来做三个数据帧df1.merge(df2.merge(df3, on='date'), on='date'),但是,使用多个数据帧,它变得非常复杂和难以理解.
所有数据帧都有一个共同的列 - date但它们没有相同数量的行或列,我只需要每个日期对每个数据帧都是通用的那些行.
所以,我正在尝试编写一个递归函数,它返回一个包含所有数据的数据帧,但它不起作用.那么我应该如何合并多个数据帧呢?
我试图diferent的方式,得到了类似的错误out of range,keyerror 0/1/2/3和can not merge DataFrame with instance of type <class 'NoneType'>.
这是我写的脚本:
dfs = [df1, df2, df3] # list of dataframes
def mergefiles(dfs, countfiles, i=0):
if i == (countfiles - 2): # it gets to the second to last and merges it with the last
return
dfm = dfs[i].merge(mergefiles(dfs[i+1], countfiles, i=i+1), on='date')
return dfm
print(mergefiles(dfs, len(dfs)))
Run Code Online (Sandbox Code Playgroud)
一个例子:df_1:
May 19, …Run Code Online (Sandbox Code Playgroud) 我有几个时间序列合并到一个常见的DataFrame的问题.我正在使用的示例代码:
import pandas
import datetime
import numpy as np
start = datetime.datetime(2001, 1, 1)
end = datetime.datetime(2001, 1, 10)
dates = pandas.date_range(start, end)
serie_1 = pandas.Series(np.random.randn(10), index = dates)
start = datetime.datetime(2001, 1, 2)
end = datetime.datetime(2001, 1, 11)
dates = pandas.date_range(start, end)
serie_2 = pandas.Series(np.random.randn(10), index = dates)
start = datetime.datetime(2001, 1, 3)
end = datetime.datetime(2001, 1, 12)
dates = pandas.date_range(start, end)
serie_3 = pandas.Series(np.random.randn(10), index = dates)
print 'serie_1'
print serie_1
print 'serie_2'
print serie_2
print 'serie_3'
print …Run Code Online (Sandbox Code Playgroud) 我想将九个Pandas数据帧合并到一个数据帧中,在两列上进行连接,控制列名.这可能吗?
我有九个数据集.所有这些都有以下列:
org, name, items,spend
Run Code Online (Sandbox Code Playgroud)
我想将它们加入到包含以下列的单个数据框中:
org, name, items_df1, spend_df1, items_df2, spend_df2, items_df3...
Run Code Online (Sandbox Code Playgroud)
我一直在阅读有关合并和加入的文档.我现在可以合并两个数据集,如下所示:
ad = pd.DataFrame.merge(df_presents, df_trees,
on=['practice', 'name'],
suffixes=['_presents', '_trees'])
Run Code Online (Sandbox Code Playgroud)
这很好用,print list(aggregate_data.columns.values)给我看了以下几列:
[org', u'name', u'spend_presents', u'items_presents', u'spend_trees', u'items_trees'...]
Run Code Online (Sandbox Code Playgroud)
但是我如何为九列做到这一点?merge似乎每次只接受两个,如果我按顺序执行,我的列名最终会变得非常混乱.
鉴于以下数据框,
df = pd.DataFrame({'Student':['Siri','Alexa'], 'Class':['6', '7'], 'Section':['A','B'], 'Teacher':['Ravi','Mark'], 'School':['C','D']})
Run Code Online (Sandbox Code Playgroud)
我想返回一个包含所有列值的所有可能组合的表。我使用下面的代码实现了这一点
df['key'] = 1
df1 = pd.merge(df.loc[:, ['key','Student']], df.loc[:,['key','Class']], how='outer')
df2 = df1.merge(df.loc[:,['key','Section']], how='outer')
df3 = df2.merge(df.loc[:,['key','Teacher']], how='outer')
df4 = df3.merge(df.loc[:,['key','School']], how='outer')
df4.drop(columns='key', inplace=True)
Run Code Online (Sandbox Code Playgroud)
完成此操作的最简单方法是什么,因为我有 15 列,通过上述方法,会导致 14 次合并和低效代码?
我想合并/加入多个Dataframes,到目前为止我没有运气.我找到了merge方法,但它只适用于两个Dataframe.我也发现这个SO 答案建议做这样的事情:
df1.merge(df2,on='name').merge(df3,on='name')
Run Code Online (Sandbox Code Playgroud)
不幸的是,它不适用于我的情况,因为我有20多个数据帧.
我的下一个想法是使用join.根据连接多个数据帧时的参考,我需要使用列表,只有我可以加入索引列.所以我更改了所有列的索引(好吧,它可以通过语法轻松完成)并最终得到如下内容:
df.join([df1,df2,df3])
Run Code Online (Sandbox Code Playgroud)
不幸的是,这种方法也失败了,因为其他列名在所有数据帧中都是相同的.我决定做最后一件事,那就是重命名所有列.但是当我最终加入所有内容时:df = pd.Dataframe()df.join([df1,df2,df3])
我收到了空数据框.我不知道,我怎么能加入他们.有人可以提出更多建议吗?
EDIT1:
样本输入:
import pandas as pd
df1 = pd.DataFrame(np.array([
['a', 5, 19],
['b', 14, 16],
['c', 4, 9]]),
columns=['name', 'attr1', 'attr2'])
df2 = pd.DataFrame(np.array([
['a', 15, 49],
['b', 4, 36],
['c', 14, 9]]),
columns=['name', 'attr1', 'attr2'])
df1
name attr1 attr2
0 a 5 19
1 b 14 16
2 c 4 9
df2
name attr1 attr2
0 a 15 49
1 b 4 …Run Code Online (Sandbox Code Playgroud) 希望你能帮助我.我是蟒蛇和熊猫的新手,所以请耐心等待.我试图找到三个数据框之间的常用词,我正在使用Jupiter Notebook.
仅举例如:
df1=
A
dog
cat
cow
duck
snake
df2=
A
pig
snail
bird
dog
df3=
A
eagle
dog
snail
monkey
Run Code Online (Sandbox Code Playgroud)
在所有数据框中只有一列是A.我想找到1.所有列中的常用词2.对于它们自己的列而言并不共同的词.例; duck是df1独有的,snail是df2独有的,而monkey是df3独有的.我正在使用以下代码进行一些使用,但没有得到我想要的简单,
df1[df1['A'].isin(df2['A']) & (df2['A']) & (df3['A'])]
Run Code Online (Sandbox Code Playgroud)
请告诉我哪里出错了.干杯
我有多个pandas数据帧,为了保持简单,让我说我有三个.
>> df1=
col1 col2
id1 A B
id2 C D
id3 B A
id4 E F
>> df2=
col1 col2
id1 B A
id2 D C
id3 M N
id4 F E
>> df3=
col1 col2
id1 A B
id2 D C
id3 N M
id4 E F
Run Code Online (Sandbox Code Playgroud)
需要的结果是:
>> df=
col1 col2
id1 A B
id2 C D
id3 E F
Run Code Online (Sandbox Code Playgroud)
因为对(A,B),(C,D),(E,F)出现在所有数据帧中,尽管它可以颠倒.
使用pandas merge时,只考虑列的传递方式.为了检查我的观察,我尝试了两个数据框的以下代码:
df1['reverse_1'] = (df1.col1+df1.col2).isin(df2.col1 + df2.col2)
df1['reverse_2'] = (df1.col1+df1.col2).isin(df2.col2 + df2.col1)
Run Code Online (Sandbox Code Playgroud)
我发现结果不同:
col1 col2 reverse_1 …Run Code Online (Sandbox Code Playgroud) 我有两个数据框,我想根据匹配的行将它们合并为一个数据框。我的数据框看起来像这样
DF_1
设置_1传真_1传真_2 Abc_1 45 76 Abc_2 46 77 Abc_3 47 78 Abc_4 48 79 Abc_5 49 80 Abc_6 50 81 Abc_7 51 82 Abc_8 52 83 Abc_9 53 84 Abc_10 54 85
df_2
设置_1传真_3传真_4 Abc_1 69 42 Abc_2 70 43 Abc_3 71 44 Abc_6 72 45 Abc_5 73 46 Abc_6 74 47 Abc_7 75 48 Abc_8 76 49 Abc_9 77 50 Abc_10 78 51 Abc_11 55 86 Abc_12 56 87 Abc_13 57 88 Abc_14 58 89 Abc_15 59 90 …
python ×10
pandas ×9
dataframe ×4
merge ×2
intersection ×1
join ×1
python-3.2 ×1
python-3.x ×1
reduce ×1
series ×1
string ×1
time-series ×1