使用pandas附加到数据帧单元?

时间:2018-05-25 21:48:39

标签: python pandas dataframe

我正在开发一个代码,根据某些列中的数据为用户分配代码。我使用了pandas数据帧。我用一个初始值填充标记列没有问题,但如果一个人应该有多个标记,我无法弄清楚如何附加到初始值。

数据框将每个单元格视为一个字符串,非常确定我希望它是一个列表。

df["Shopify Tags"] = ''
df.set_index(ID, inplace=True)

i = 0

for index, row in df.iterrows():

     if "Medical" in df.iloc[i,2]:

          df.iloc[i,4] = "#Medical"


     if "40" in df.iloc[i,2]:

         df.iloc[i,4].append('#Discount40')


 i+=1

我希望Shopify标签列最终看起来像每行#Medical, #Discount40, #OtherTags

这是我关于SO的第一个问题:)

1 个答案:

答案 0 :(得分:2)

您的问题值得注意2点:

  1. 在数据框中保留列表效率低下,不推荐使用。这是因为它们是通过指针存储而不是存储在连续的存储块中。这意味着无法进行矢量化计算。
  2. 您应该只在数据框中迭代行作为最后的手段。 Pandas专注于矢量化计算。即使对于非向量化操作,也存在避免显式for循环的方法。
  3. 注意到这些要点后,下面是一个解决方案。

    # example dataframe
    df = pd.DataFrame({'col1': 1,
                       'col2': ['Medical 1234', 'Medical 40 Something',
                                '40 something', 'Nothing'],
                       'col3': 3})
    
    # define function which creates a list from a dictionary mapping
    def lister(x):
        mapping = {'Medical': '#Medical', '40': '#Discount40'}
        return [v for k, v in mapping.items() if k in x]
    
    # apply function to series
    df['col4'] = df['col2'].apply(lister)
    
    print(df)
    
       col1                  col2  col3                     col4
    0     1          Medical 1234     3               [#Medical]
    1     1  Medical 40 Something     3  [#Medical, #Discount40]
    2     1          40 something     3            [#Discount40]
    3     1               Nothing     3