比较两个不同数据框的两列
Compare two columns of two different dataframes
最近,我用 pandas 从 matlab 切换到 python。它一直运行良好,但我坚持有效地解决以下问题。对于我的分析,我必须使用看起来像这样的数据框:
dfA =
NUM In Date
0 2345 we 1 01/03/16
1 3631 we 1 23/02/16
2 2564 we 1 12/02/16
3 8785 sz 2 01/03/16
4 4767 dt 6 01/03/16
5 3452 dt 7 23/02/16
6 2134 sz 2 01/03/16
7 3465 sz 2 01/03/16
和
dfB
In Count_Num
0 we 1 3
1 sz 2 2
2 dt 6 3
3 dt 7 1
我想执行的是一个操作,将 dfA 中所有 "In" 的所有 'Num' 相加,并将其与 dfB 中的 "Count_num" 进行比较。之后,如果比较是 True 或 False,我想在 dfB 中添加一列到 return。在上面的例子中,操作应该return this:
dfB
In Count_Num Check
0 we 1 3 True
1 sz 2 2 False
2 dt 6 1 True
3 dt 7 1 True
我的做法:
使用 value_counts() 和 pd.DataFrame,我从 dfA 构建了以下 dfC
dfC =
In_Number In_Total
0 we 1 4
1 sz 2 3
2 dt 6 1
3 dt 7 1
然后我将它与 dfB 合并,然后通过比较 dfB 中的列来检查值是否相同。在这种情况下,我必须结束删除列。有 better/faster 的方法吗?我认为有一种方法可以使用 pandas 一个很棒的函数来非常有效地做到这一点。我已经尝试研究 lookup
和 map
,但我无法让它工作。
感谢您的帮助!
您可以尝试 merge
dfB
and dfA
with groupby
and count
by column In
, then add new column check
for comparison merged columns and last drop
列 NUM
:
print dfA
NUM In Date
0 2345 we 1 01/03/16
1 3631 we 1 23/02/16
2 2564 we 1 12/02/16
3 8785 sz 2 01/03/16
4 4767 dt 6 01/03/16
5 3452 dt 7 23/02/16
6 2134 sz 2 01/03/16
7 3465 sz 2 01/03/16
print dfB
In Count_Num
0 we 1 3
1 sz 2 2
2 dt 6 3
3 dt 7 1
print dfA.groupby('In', as_index=False)['NUM'].count()
In NUM
0 dt 6 1
1 dt 7 1
2 sz 2 3
3 we 1 3
df = pd.merge(dfB, dfA.groupby('In', as_index=False)['NUM'].count(), on=['In'])
print df
In Count_Num NUM
0 we 1 3 3
1 sz 2 2 3
2 dt 6 3 1
3 dt 7 1 1
df['check'] = df['NUM'] == df['Count_Num']
df = df.drop('NUM', axis=1)
print df
In Count_Num check
0 we 1 3 True
1 sz 2 2 False
2 dt 6 3 False
3 dt 7 1 True
或者你可以使用 rename
而不使用 drop
:
df = pd.merge(dfB, dfA.groupby('In', as_index=False)['NUM'].count(), on=['In'])
print df
In Count_Num NUM
0 we 1 3 3
1 sz 2 2 3
2 dt 6 3 1
3 dt 7 1 1
df['NUM'] = df['NUM'] == df['Count_Num']
df = df.rename(columns={'NUM':'Check'})
print df
In Count_Num Check
0 we 1 3 True
1 sz 2 2 False
2 dt 6 3 False
3 dt 7 1 True
最近,我用 pandas 从 matlab 切换到 python。它一直运行良好,但我坚持有效地解决以下问题。对于我的分析,我必须使用看起来像这样的数据框:
dfA =
NUM In Date
0 2345 we 1 01/03/16
1 3631 we 1 23/02/16
2 2564 we 1 12/02/16
3 8785 sz 2 01/03/16
4 4767 dt 6 01/03/16
5 3452 dt 7 23/02/16
6 2134 sz 2 01/03/16
7 3465 sz 2 01/03/16
和
dfB
In Count_Num
0 we 1 3
1 sz 2 2
2 dt 6 3
3 dt 7 1
我想执行的是一个操作,将 dfA 中所有 "In" 的所有 'Num' 相加,并将其与 dfB 中的 "Count_num" 进行比较。之后,如果比较是 True 或 False,我想在 dfB 中添加一列到 return。在上面的例子中,操作应该return this:
dfB
In Count_Num Check
0 we 1 3 True
1 sz 2 2 False
2 dt 6 1 True
3 dt 7 1 True
我的做法:
使用 value_counts() 和 pd.DataFrame,我从 dfA 构建了以下 dfC dfC =
In_Number In_Total
0 we 1 4
1 sz 2 3
2 dt 6 1
3 dt 7 1
然后我将它与 dfB 合并,然后通过比较 dfB 中的列来检查值是否相同。在这种情况下,我必须结束删除列。有 better/faster 的方法吗?我认为有一种方法可以使用 pandas 一个很棒的函数来非常有效地做到这一点。我已经尝试研究 lookup
和 map
,但我无法让它工作。
感谢您的帮助!
您可以尝试 merge
dfB
and dfA
with groupby
and count
by column In
, then add new column check
for comparison merged columns and last drop
列 NUM
:
print dfA
NUM In Date
0 2345 we 1 01/03/16
1 3631 we 1 23/02/16
2 2564 we 1 12/02/16
3 8785 sz 2 01/03/16
4 4767 dt 6 01/03/16
5 3452 dt 7 23/02/16
6 2134 sz 2 01/03/16
7 3465 sz 2 01/03/16
print dfB
In Count_Num
0 we 1 3
1 sz 2 2
2 dt 6 3
3 dt 7 1
print dfA.groupby('In', as_index=False)['NUM'].count()
In NUM
0 dt 6 1
1 dt 7 1
2 sz 2 3
3 we 1 3
df = pd.merge(dfB, dfA.groupby('In', as_index=False)['NUM'].count(), on=['In'])
print df
In Count_Num NUM
0 we 1 3 3
1 sz 2 2 3
2 dt 6 3 1
3 dt 7 1 1
df['check'] = df['NUM'] == df['Count_Num']
df = df.drop('NUM', axis=1)
print df
In Count_Num check
0 we 1 3 True
1 sz 2 2 False
2 dt 6 3 False
3 dt 7 1 True
或者你可以使用 rename
而不使用 drop
:
df = pd.merge(dfB, dfA.groupby('In', as_index=False)['NUM'].count(), on=['In'])
print df
In Count_Num NUM
0 we 1 3 3
1 sz 2 2 3
2 dt 6 3 1
3 dt 7 1 1
df['NUM'] = df['NUM'] == df['Count_Num']
df = df.rename(columns={'NUM':'Check'})
print df
In Count_Num Check
0 we 1 3 True
1 sz 2 2 False
2 dt 6 3 False
3 dt 7 1 True