在pandas中向现有列添加值

9
我遍历目录中的csv文件,并使用pandas读取它们。 对于每个csv文件,我有一个类别和一个市场。 然后,我需要从数据库中获取此csv文件有效的类别ID和市场ID。
finalDf是包含所有csv文件中所有产品的数据框架,我需要将其与当前csv的数据合并。
当前CSV的产品列表可使用以下方法检索:
df['PRODUCT']

我需要将它们附加到finalDf中,我使用了以下代码:
finalDf['PRODUCT'] =  finalDf['PRODUCT'].append(df['PRODUCT'],ignore_index=True)

这似乎很好地运作了,现在我需要将catid和marketid插入到finalDf的相应列中。因为catid和marketid在当前csv文件中是一致的,所以我只需要将它们添加与df数据帧中的行数相同的次数,这就是我试图在下面的代码中实现的。

finalDf = pd.DataFrame(columns=['PRODUCT', 'CAT_ID', 'MARKET_ID'])
finalDf['PRODUCT'] = finalDf.PRODUCT.astype('category')

df = pd.read_csv(filename, header=None,
                             names=['PRODUCT', 'URL_PRODUCT', 'RANK', 'URL_IMAGE', 'STARS', 'PRICE', 'NAME', 'SNAPDATE',
                                    'CATEGORY', 'MARKETPLACE', 'PARENTCAT', 'LISTTYPE', 'VERSION', 'LEVEL'], sep='\t')

finalDf['PRODUCT'] = finalDf['PRODUCT'].append(df['PRODUCT'],ignore_index=True)
# Here I have a single value to add n times, n corresponding to the number of rows in the dataframe df
catid = 2113
marketid = 13
catids = pd.Series([catid]*len(df.index))
marketids = pd.Series([marketid]*len(df.index))
finalDf['CAT_ID'] = finalDf['CAT_ID'].append(catids, ignore_index=True)
finalDf['MARKET_ID'] = finalDf['MARKET_ID'].append(marketids, ignore_index=True)

print finalDf.head()

        PRODUCT  CAT_ID  MARKET_ID
    0    ABC       NaN    NaN
    1    ABB       NaN    NaN
    2    ABE       NaN    NaN
    3    DCB       NaN    NaN
    4    EFT       NaN    NaN

正如您所看到的,我只有NaN值而不是实际值。

        PRODUCT  CAT_ID  MARKET_ID
    0    ABC       2113    13
    1    ABB       2113    13
    2    ABE       2113    13
    3    DCB       2113    13
    4    EFT       2113    13

finalDF 包含多个 csv 文件,看起来像这样:

        PRODUCT  CAT_ID  MARKET_ID
    0    ABC       2113    13
    1    ABB       2113    13
    2    ABE       2113    13
    3    DCB       2113    13
    4    EFT       2113    13
    5    SDD       2114    13
    6    ERT       2114    13
    7    GHJ       2114    13
    8    MOD       2114    13
    9    GTR       2114    13
   10    WLY       2114    13
   11    WLO       2115    13
   12    KOP       2115    13

有什么想法吗?

谢谢


请问您所说的“添加值到现有列”是指什么?您是要将 2113 添加到数字列中,还是将字符串“2113”添加到每个项目的末尾? - jpp
将数字2113添加到现有列的末尾,重复n次。其中n是从CSV文件中读取的行数。 - Cyrille MODIANO
您介意在您的问题中编辑并提供期望的输出吗?我仍然有点困惑,不太清楚您需要什么(可能是现有答案)。 - jpp
已添加预期输出。您需要记住,每次catid和marketid都会不同,因此我确实需要将新值附加到现有列中,而不是用新值替换该列中的所有值。 - Cyrille MODIANO
finalDf.tail()看起来会是什么样子?CAT_IDMARKET_ID的值也会相同吗?你从哪里获取catidmarkedid?我还是没有完全理解你的任务全貌。 - Cedric Zoppolo
我已经将预期输出添加了更多行。正如您所看到的,finalDf将包含许多不同的CAT_IDs。这些值来自数据库。真正的问题是如何将finalDf的一列附加上值。 - Cyrille MODIANO
2个回答

12

我终于找到了解决方案,虽然不知道为什么另一个方法不起作用。 但这个方法更简单:

tempDf = pd.DataFrame(columns=['PRODUCT','CAT_ID','MARKET_ID'])
tempDf['PRODUCT'] = df['PRODUCT']
tempDf['CAT_ID'] = catid
tempDf['MARKET_ID'] = 13

finalDf = pd.concat([finalDf,tempDf])

0

实际上,您不需要catids和marketids:

finalDf['CAT_ID'] = catid
finalDf['MARKET_ID'] = marketid

可以工作。

对于脚本的其余部分,我可能会以这种方式使事情变得更简单:

finalDf = pd.DataFrame()
finalDf['PRODUCT'] = df['PRODUCT'].reset_index()

假设您对df的原始索引不感兴趣,正如您的代码所示。


我简化了代码,但是每次循环中catid都会改变,所以它不起作用。 - Cyrille MODIANO
1
那我不明白你的问题。 - Paul-Darius
我会编辑问题,可能我过于简化了它。 - Cyrille MODIANO

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接