将for循环中的每个值附加到pandas数据框中的列单元格中

时间:2018-09-12 10:31:51

标签: python pandas for-loop dataframe

我已根据条件将数据帧分为两部分。我将两个数据框中的“ ItemName”列都转换为一个列表。

我尝试使用difflib在两列之间执行近似的字符串匹配,这些列中的每一个均称为“ ItemName”。我想将名为“ matchlist”的列表作为一列添加到源数据帧中,或者另一方面,如果我可以将for循环的每个输出附加到源数据帧中的新列中就可以了。

source = list(datadf['ItemName'])
destination = list(datadf['ItemName'])

matchlist = []
for i in source:
    x = difflib.get_close_matches(i, destination, 3, 0.6)
    matchlist.append(x)

我确实尝试过在熊猫中加入和合并选项,但没有任何错误,新添加的列仅显示NaN值。这两个名为“ ItemName”的列均仅包含字符串值。

有人可以提供解决方法的想法吗?

1 个答案:

答案 0 :(得分:0)

我认为需要将清单分配回去

datadf['new'] = matchlist

或使用列表理解代替循环解决方案:

datadf = pd.DataFrame({
    'ItemName': ['as','asds','as','aa','ssb','ab','sb']
})
print (datadf)
  ItemName
0       as
1     asds
2       as
3       aa
4      ssb
5       ab
6       sb

#convert to list is not necessary
L = datadf['ItemName']
datadf['new'] = [difflib.get_close_matches(i, L, 3, 0.6) for i in L]
print (datadf)
  ItemName             new
0       as  [as, as, asds]
1     asds  [asds, as, as]
2       as  [as, as, asds]
3       aa            [aa]
4      ssb       [ssb, sb]
5       ab            [ab]
6       sb       [sb, ssb]

编辑:

如果需要检查不同DataFrames的2列之间:

datadf = pd.DataFrame({ 'Fruits':pd.Categorical(['apple','orange', 'apple', 'pineapple']), 
                      'Juices':pd.Categorical(['apple','orange smash','apple1','milkshake']), 
                      'Year': pd.Categorical([2011, 2011, 2012, 2012])}) 
print (datadf)
      Fruits        Juices  Year
0      apple         apple  2011
1     orange  orange smash  2011
2      apple        apple1  2012
3  pineapple     milkshake  2012

data_df_splitone = datadf[(datadf['Year'] == 2011)].copy()
data_df_splittwo = datadf[(datadf['Year'] == 2012)].copy()

L1 = data_df_splitone['Juices']
L2 = data_df_splittwo['Juices']

data_df_splitone['new'] = [difflib.get_close_matches(i, L2, 3, 0.6) for i in L1]
print (data_df_splitone)
   Fruits        Juices  Year       new
0   apple         apple  2011  [apple1]
1  orange  orange smash  2011        []