LEFT| RIGHT| FULL)(INNER| OUTER)连接?merge?join?concat?update?谁?什么?为什么?!... 和更多.我已经看到了这些反复出现的问题,询问了pandas合并功能的各个方面.今天关于合并及其各种用例的大部分信息在几十个措辞严厉,不可搜索的帖子中都是分散的.这里的目的是为后代整理一些更重要的观点.
这个QnA应该是关于常见熊猫习语的一系列有用的用户指南的下一部分(参见关于转动的这篇文章,以及关于连接的这篇文章,我将在稍后介绍).
请注意,这篇文章并不是文档的替代品,所以请阅读它!一些例子来自那里.
我有两个numpy数组,定义网格的x和y轴.例如:
x = numpy.array([1,2,3])
y = numpy.array([4,5])
Run Code Online (Sandbox Code Playgroud)
我想生成这些数组的笛卡尔积来生成:
array([[1,4],[2,4],[3,4],[1,5],[2,5],[3,5]])
Run Code Online (Sandbox Code Playgroud)
在某种程度上,由于我需要在循环中多次执行此操作,因此效率不高.我假设将它们转换为Python列表并使用itertools.product并返回到numpy数组并不是最有效的形式.
我有两个pandas数据帧:
from pandas import DataFrame
df1 = DataFrame({'col1':[1,2],'col2':[3,4]})
df2 = DataFrame({'col3':[5,6]})
Run Code Online (Sandbox Code Playgroud)
获得笛卡尔积的最佳做法是什么(当然不像我这样明确地写出来)?
#df1, df2 cartesian product
df_cartesian = DataFrame({'col1':[1,2,1,2],'col2':[3,4,3,4],'col3':[5,5,6,6]})
Run Code Online (Sandbox Code Playgroud) 我找不到任何关于交叉连接的内容,包括合并/加入或其他一些.我需要使用{my function}作为myfunc来处理两个数据帧.相当于:
{
for itemA in df1.iterrows():
for itemB in df2.iterrows():
t["A"] = myfunc(itemA[1]["A"],itemB[1]["A"])
}
Run Code Online (Sandbox Code Playgroud)
相当于:
{
select myfunc(df1.A,df2.A),df1.A,df2.A from df1,df2;
}
Run Code Online (Sandbox Code Playgroud)
但我需要更有效的解决方案:如果使用apply我将是如何实现它们thx; ^^
我有一个 Pandas DataFrame,如下所示:
df = pd.DataFrame({'col1': [1, 2, 3],
'col2': [4, 5, 6],
'col3': [7, 8, 9]})
df
col1 col2 col3
0 1 4 7
1 2 5 8
2 3 6 9
Run Code Online (Sandbox Code Playgroud)
我想创建一个像这样的 Pandas DataFrame:
df_new
col1 col2 col3
0 1 4 7
1 1 5 8
2 1 6 9
3 2 4 7
4 2 5 8
5 2 6 9
6 3 4 7
7 3 5 8
8 3 6 9
Run Code Online (Sandbox Code Playgroud)
是否有内置或内置 Pandas 方法的组合可以实现此目的?
即使 …
假设我有两张桌子:
表格1:
col1 col2
0 1
2 3
Run Code Online (Sandbox Code Playgroud)
表2:
col3 col4
5 6
7 8
Run Code Online (Sandbox Code Playgroud)
在SQL中,如果我发出以下声明:
Select *
From Table1, Table2;
Run Code Online (Sandbox Code Playgroud)
我期望从两个表中获得包含所有组合的表格:
col1 col2 col3 col4
0 1 5 6
0 1 7 8
2 3 5 6
2 3 7 8
Run Code Online (Sandbox Code Playgroud)
有没有办法在pandas中使用两个数据帧做同样的事情?
如何使用pandas 执行完全外连接 两个数据帧的交叉连接而没有共同的列?
在MySQL中,您可以简单地执行:
SELECT *
FROM table_1
[CROSS] JOIN table_2;
Run Code Online (Sandbox Code Playgroud)
但在熊猫中,做:
df_1.merge(df_2, how='outer')
Run Code Online (Sandbox Code Playgroud)
给出错误:
MergeError: No common columns to perform merge on
Run Code Online (Sandbox Code Playgroud)
我到目前为止最好的解决方案是使用sqlite:
import sqlalchemy as sa
engine = sa.create_engine('sqlite:///tmp.db')
df_1.to_sql('df_1', engine)
df_2.to_sql('df_2', engine)
df = pd.read_sql_query('SELECT * FROM df_1 JOIN df_2', engine)
我知道这个问题已经被问过很多次了。我尝试了几种解决方案,但无法解决我的问题。
我有一个大的嵌套 JSON 文件 (1.4GB),我想把它弄平,然后将其转换为 CSV 文件。
JSON 结构是这样的:
{
"company_number": "12345678",
"data": {
"address": {
"address_line_1": "Address 1",
"locality": "Henley-On-Thames",
"postal_code": "RG9 1DP",
"premises": "161",
"region": "Oxfordshire"
},
"country_of_residence": "England",
"date_of_birth": {
"month": 2,
"year": 1977
},
"etag": "26281dhge33b22df2359sd6afsff2cb8cf62bb4a7f00",
"kind": "individual-person-with-significant-control",
"links": {
"self": "/company/12345678/persons-with-significant-control/individual/bIhuKnFctSnjrDjUG8n3NgOrl"
},
"name": "John M Smith",
"name_elements": {
"forename": "John",
"middle_name": "M",
"surname": "Smith",
"title": "Mrs"
},
"nationality": "Vietnamese",
"natures_of_control": [
"ownership-of-shares-50-to-75-percent"
],
"notified_on": "2016-04-06"
}
}
Run Code Online (Sandbox Code Playgroud)
我知道这很容易用pandas模块完成,但我不熟悉它。
已编辑
所需的输出应该是这样的:
company_number, address_line_1, locality, …Run Code Online (Sandbox Code Playgroud) 我一直在尝试为数据框的每一行分配一个值,但我一直没有这样做(我是熊猫新手),所以如果有人可以提供帮助,我将非常感激!
我有两个数据框。在输入数据框中,我有以下品牌:
brand_raw.head()
brand_name
0 Nike
1 Lacoste
2 Adidas
Run Code Online (Sandbox Code Playgroud)
然后,在输出数据集上,我有一些对象:
object_raw.head()
category_id object_name
0 24 T-shirt
1 45 Shorts
2 32 Dress
Run Code Online (Sandbox Code Playgroud)
我需要的是一个包含所有对象和所有品牌的数据框:
to_raw.head()
category_id object_name brand_name
0 24 T-shirt Nike
1 45 Shorts Nike
2 32 Dress Nike
3 24 T-shirt Lacoste
4 45 Shorts Lacoste
5 32 Dress Lacoste
6 24 T-shirt Adidas
7 45 Shorts Adidas
8 32 Dress Adidas
Run Code Online (Sandbox Code Playgroud)
我一直在尝试使用apply函数,对行进行迭代,但是最终覆盖了值,所以我写了最后一个品牌:
0 24 T-shirt Nike
1 45 Shorts Nike
2 32 Dress Nike
Run Code Online (Sandbox Code Playgroud)
这是我的代码:
def insert_value_in_every_row(input_df, …Run Code Online (Sandbox Code Playgroud) 我试图获得一个数据帧,其中包含两个不同数据帧中两个独立列的所有组合.我的数据框看起来像这样:
>>>first_df >>>second_df
id test id text
0 1 abc 0 11 uvw
1 2 def 1 22 xyz
2 3 ghi
Run Code Online (Sandbox Code Playgroud)
由此,我能够使用这种方法获得组合:
df = pd.DataFrame(list(itertools.product(list(a['test']),list(b['text']))),columns=['test','text'])
>>>df
test text
0 abc uvw
1 abc xyz
2 def uvw
3 def xyz
4 ghi uvw
5 ghi xyz
Run Code Online (Sandbox Code Playgroud)
我无法理解的是,如何将相关的id列也添加到我的数据框中,如下所示:
>>>df
id test text kid
0 1 abc uvw 11
1 1 abc xyz 22
2 2 def uvw 11
3 2 def xyz 22
4 3 ghi uvw 11
5 3 …Run Code Online (Sandbox Code Playgroud) dft = pd.DataFrame({'C1': ['A','A','B','B'],
'C2': [1,2,3,4]})
def lam3(df):
return pd.DataFrame({'X': ['C','D','E'],
'Y': [11,22,33]})
Run Code Online (Sandbox Code Playgroud)
给定上述数据帧和函数(我无法更改),我想运行 groupby+apply 以便每个组返回一个数据帧,如下所示
C1 C2 X Y
0 A 1 C 11
1 A 1 D 22
2 A 1 E 33
3 A 2 C 11
4 A 2 D 22
5 A 2 E 33
6 B 3 C 11
7 B 3 D 22
8 B 3 E 33
9 B 4 C 11
10 B 4 D 22
11 B 4 E 33 …Run Code Online (Sandbox Code Playgroud) 我在 3 轴 (x, y, z) 中有两个错误数据帧:
df1 = pd.DataFrame([[0, 1, 2], [-1, 0, 1], [-2, 0, 3]], columns = ['x', 'y', 'z'])
df2 = pd.DataFrame([[1, 1, 3], [1, 0, 2], [1, 0, 3]], columns = ['x', 'y', 'z'])
Run Code Online (Sandbox Code Playgroud)
我正在寻找一种快速的方法来找到两个数据帧的每一行的平方的笛卡尔和。
编辑我目前的解决方案:
cartesian_sum = list(np.sum(list(tup), axis = 0).tolist()
for tup in itertools.product( (df1**2).to_numpy().tolist(),
(df2**2).to_numpy().tolist() ) )
cartesian_sum
>>>
[[1, 2, 13],
[1, 1, 8],
[1, 1, 13],
[2, 1, 10],
[2, 0, 5],
[2, 0, 10],
[5, 1, 18],
[5, …Run Code Online (Sandbox Code Playgroud)