【发布时间】:2015-07-13 17:07:31
【问题描述】:
[瞄准]
我们有一个现有的数据框,并希望在一个命令或另一个数据框中给定条件下提取一系列记录和连接(sql join on self)。
[情况]
Python版本:3.3.3
熊猫版本:0.15.1
我们有一个包含 10,000 多行的相当大的 DataFrame。这只是一个理解逻辑的例子。
DataFrame1 -> df1:
import pandas as pd
df1 = pd.DataFrame({'A': [1,2,3,1],
'B': [1,4,1,2],
'C': ['test1','test2','test3','test4']
})
Resulting in:
A B C
1 1 test1
2 4 test2
3 1 test3
1 2 test4
5 8 test5
[预期输出]
我们正在寻找输出:
- 所有列 A、B、C,其中:B = 1 -> 输出 = df1[df1['B'] == 1]
- 添加到输出所有那些
output['A'] == df1['A']
AND
df1['B'] == 2
因此:
A B C
1 1 test1
3 1 test3
1 2 test4
展示最pythonic / pandanic(听起来很奇怪)的方式会很棒:)
【问题讨论】:
-
您尝试过什么吗?
-
是的,我们可以从两者中检索数据,然后将它们连接起来:out1 = df1[df1['B'] == 1] out2 = df1[df1['B'] == 2]但也许我应该指定我有一个 10,000 行以上的相当大的 DataFrame。我的意思是从技术上讲我们可以做一个 for 循环,但我确信有一种更简洁的方法可以使用一些很酷的 DataFrame 功能(concat/merge/join -> 我只是看不到条件连接)。通常我会在给定条件的情况下加入一个 SQL 表,但由于某种原因我在这种情况下看不到它
-
鉴于上面的 out1 和 out2,我们可以做这样的事情: result = pd.merge(out1, out2, left_on='A', right_on='A', how='left') 但是在这里,我们合并了列。我想做一个 result = pd.concat(out1, out2, left_on='A', right_on='A', how='left') 但这显然会导致错误..
-
@Mark 我刚刚修改了我的答案。让我知道这是否适合你。
-
@JianxunLi 我也评论了你的回答:)。是的,它似乎有效,但我似乎无法理解为什么我们有所有这些漂亮的功能来合并列而不是行:/
标签: python python-3.x pandas