2017-05-03 130 views
4

长时间潜伏,但第一次在StackOverflow上发布海报。执行合并时防止重复行

我用我正在处理的一个数据分析项目打了一堵墙。

本质上,如果我有例如CSV 'A':

id | item_num 
A123 |  1 
A123 |  2 
B456 |  1 

我有例如CSV 'B':

id | description 
A123 | Mary had a... 
A123 | ...little lamb. 
B456 | ...Its fleece... 

如果我执行merge使用Pandas,它最终像这个:

id | item_num | description 
A123 |  1 | Mary had a... 
A123 |  2 | Mary had a... 
A123 |  1 | ...little lamb. 
A123 |  2 | ...little lamb. 
B456 |  1 | Its fleece... 

我怎么能让它变成:

id | item_num | description 
A123 |  1 | Mary had a... 
A123 |  2 | ...little lamb... 
B456 |  1 | Its fleece... 

这是我的代码:

import pandas as pd 

# Import CSVs 
first = pd.read_csv("../PATH_TO_CSV/A.csv") 
print("Imported first CSV: " + str(first.shape)) 
second = pd.read_csv("../PATH_TO_CSV/B.csv") 
print("Imported second CSV: " + str(second.shape)) 


# Create a resultant, but empty, DF, and then append the merge. 
result = pd.DataFrame() 
result = result.append(pd.merge(first, second), ignore_index = True) 
print("Merged CSVs... resulting DataFrame is: " + str(result.shape)) 

# Lets do a "dedupe" to deal with an issue on how Pandas handles datetime merges 
# I read about an issue where if datetime is involved, duplicate entires will be created. 
result = result.drop_duplicates() 
print("Deduping... resulting DataFrame is: " + str(result.shape)) 

# Save to another CSV 
result.to_csv("EXPORT.csv", index=False) 
print("Saved to file.") 

我真的很感激任何帮助 - 我很卡!我正在处理20,000多行。

谢谢。

编辑:我的帖子被标记为潜在的副本。这不是,因为我不一定要添加一列 - 我只是想阻止description乘以归属于特定iditem_num的数量。


UPDATE,6/21:

我怎么可以做合并,如果2级的DF这个样子呢?

id | item_num | other_col 
A123 |  1 | lorem ipsum 
A123 |  2 | dolor sit 
A123 |  3 | amet, consectetur 
B456 |  1 | lorem ipsum 

而且我有例如CSV 'B':

id | item_num | description 
A123 |  1 | Mary had a... 
A123 |  2 | ...little lamb. 
B456 |  1 | ...Its fleece... 

所以我结束了:

id | item_num | other_col | description 
A123 |  1 | lorem ipsum | Mary Had a... 
A123 |  2 | dolor sit | ...little lamb. 
B456 |  1 | lorem ipsum | ...Its fleece... 

含义,即有3行,以“阿梅德,consectetur “在”other_col“中被忽略。

+0

的[在Python大熊猫添加新的列到现有的数据帧]可能的复制(http://stackoverflow.com/questions/12555323 /添加新的列到现有的数据框在python熊猫) – TemporalWolf

+0

它看起来像你想['concat'或'append'](http://pandas.pydata.org/pandas- docs/stable/merging.html),而不是“合并”。 – TemporalWolf

回答

1

我会做这种方式:

In [135]: result = A.merge(B.assign(item_num=B.groupby('id').cumcount()+1)) 

In [136]: result 
Out[136]: 
    id item_num  description 
0 A123   1  Mary had a... 
1 A123   2 ...little lamb. 
2 B456   1 ...Its fleece... 

说明:我们可以为加入创建“虚拟”的B DF item_num柱:

In [137]: B.assign(item_num=B.groupby('id').cumcount()+1) 
Out[137]: 
    id  description item_num 
0 A123  Mary had a...   1 
1 A123 ...little lamb.   2 
2 B456 ...Its fleece...   1 
+0

我希望这对我有效,但它似乎没有包含任何数据其中一个CSV。事实上,生成的CSV只是其中一个CSV的副本。 – kabaname

+1

@ kabaname,你确定你已经分配了合并结果吗? – MaxU

+0

不要紧,所以我得到它产生的结果 - 但它仍然乘以行,以重复“1”和“2”的描述,就像我的例子。换句话说,玛丽有一个......重复1和2,然后......小小的羔羊也在重复着。 @maxu – kabaname

1

尝试索引你的DF跌得重复:

df = df.set_index(['id', 'item_num']).drop_duplicates() 
+0

所以我试了一下,它似乎已经删除了列和所有数据......但这确实解决了重复的问题,因为剩下的数据不像以前那样重复。 – kabaname

1

我想你需要CONCAT

result = pd.concat([df1.set_index('id'), df2.set_index('id')],axis = 1).reset_index() 

你得到

id  item_no  description 
0 A123 1   Mary had a... 
1 A123 2   ...little lamb 
2 B456 1   ...Its fleece... 
+0

我得到一个'ValueError:传递值的形状是(13,10799),索引暗示(13,6240)' – kabaname