csv 如何将数据添加到Pandas DataFrame的子集中的新列?

doinxwow  于 2023-03-27  发布在  其他
关注(0)|答案(2)|浏览(129)

我正在用Python的Pandas库中的dataframes分析一个csv文件。这个文件包含了一家连锁餐厅的数据和不同的订单。它有5000多行,所以我不会在这里上传整个文件,但它看起来主要是这样的:
| 订单编号|项目名称|订购总数|
| --------------|--------------|--------------|
| 1|炸薯条|二|
| 1|汉堡包|二|
| 二|炸薯条|1|
| 三|金块|1|
基本上,第一个顾客点了2份薯条和2个汉堡,第二个点了1份薯条,第三个点了1块金块。
我只想分析dataframe中的一个订单,所有订单都归类在同一个订单号下,但有4个项目供4个人使用。如果您查看.csv文件,它看起来像这样:
| 订单编号|项目名称|订购总数|
| --------------|--------------|--------------|
| 小行星1238|汉堡包|1|
| 小行星1238|汉堡包|1|
| 小行星1238|炸薯条|1|
| 小行星1238|金块|1|
到目前为止,我已经将订单#1238的数据隔离在一个单独的dataframe中,使用这个代码,它本身工作得很好,并生成上表:

import pandas as pd

restaurant = pd.read_csv("files/restaurant_data.csv")

ordered_items = restaurant.iloc[1504:1508] #these are the positions of the cells in the table

column_names = ["order_number","item_name", "total_ordered"]

ordered_items.iloc[0:]

问题是,我试图添加另一列的dataframe,其中包括不同的客户的名字.名称不来自.csv文件.我想手动添加他们在代码.理想情况下,它看起来像:
| 订单编号|项目名称|订购总数|客户_名称|
| --------------|--------------|--------------|--------------|
| 小行星1238|汉堡包|1|珍妮|
| 小行星1238|汉堡包|1|莱昂|
| 小行星1238|炸薯条|1|图安|
| 小行星1238|金块|1|维多利亚|
然而,当我尝试这样做时,我会得到错误,例如customer_name列完全被NaN值填充,或者“A value is trying to be set on a copy of a slice from a DataFrame”。
我尝试为订单1238数据子集列出所涉及的客户列表,将其转换为Panda系列,然后将其添加为列的数据。例如:

import pandas as pd

restaurant = pd.read_csv("files/restaurant_data.csv")

customers = ["Jenny", "Leon", "Tuan", "Victoria"]
customer_name = pd.Series(customers)

ordered_items = restaurant.iloc[1504:1508]

column_names = ["order_number","item_name", "total_ordered", "customer_name"]

order_1238 = pd.DataFrame(ordered_items, columns=column_names)

order_1238.iloc[0:]

虽然这添加了我想要的customer_name列,但它实际上并没有填充列表中的数据:
| 订单编号|项目名称|订购总数|客户_名称|
| --------------|--------------|--------------|--------------|
| 小行星1238|汉堡包|1|NaN|
| 小行星1238|汉堡包|1|NaN|
| 小行星1238|炸薯条|1|NaN|
| 小行星1238|金块|1|NaN|
我尝试了其他一些方法,比如使用字典为每个客户分配数据集中的位置(而不是列表和Panda系列):

import pandas as pd

restaurant = pd.read_csv("files/restaurant_data.csv")

ordered_items = restaurant.iloc[1504:1508]

ordered_items.loc["customer_name"] = {"Jenny": restaurant.iloc[1504], 
                "Leon": restaurant.iloc[1505],
                "Tuan": restaurant.iloc[1506],
                "Victoria": restaurant.iloc[1507]
                 }

column_names = ["order_number","item_name", "total_ordered", "customer_name"]

order_1238 = pd.DataFrame(ordered_items, columns=column_names)

order_1238.iloc[0:]

然而,这段代码给了我一个警告“A value is trying to be set on a copy of a slice from a DataFrame.”,然后添加了一个全新的行,其中包含NaN值,这与预期的输出相差甚远。输出如下所示:

| order_number | item_name | total_ordered | customer_name |
            | ------------ | --------- | ------------- | ------------- |
            | 1238.0       | burger    | 1.0           | NaN           |
            | 1238.0       | burger    | 1.0           | NaN           |
            | 1238.0       | fries     | 1.0           | NaN           |
            | 1238.0       | nuggets   | 1.0           | NaN           |

朋友列表|NaN|NaN|NaN|NaN|
总的来说,不知道我哪里错了,但会感谢任何帮助!

n3h0vuf2

n3h0vuf21#

您可以像这样添加新列:

import pandas as pd

restaurant = pd.read_csv("files/restaurant_data.csv")

customers = ["Jenny", "Leon", "Tuan", "Victoria"]
ordered_items = restaurant.iloc[1504:1508]

column_names = ["order_number","item_name", "total_ordered", "customer_name"]

order_1238 = pd.DataFrame(ordered_items, columns=column_names)

order_1238['customer_name'] = customers

第一种方法的问题是,你实际上并没有在 Dataframe 中添加列值。仅仅因为列名和变量名相同并不意味着pandas会自动添加这些值。这就是为什么你会在customer_name列下看到NULL值。通过将该列分配给列表customers,你可以用相应的值填充该列。

eulz3vhy

eulz3vhy2#

你有两种可能的方法。首先,在整个DF中添加一个customer_name列,最初填充的是空字符串:

customers = ["Jenny", "Leon", "Tuan", "Victoria"]

restaurant['customer_name'] = ""

然后在需要的行中添加所需的值:

restaurant.loc[1504:1508, 'customer_name'] = customers

上面的代码将改变整个dataframe,如果这是你想要的。但是如果你只想有dataframe的一个子集,并添加列,那么你必须首先提取并复制子集

order_1238 = restaurant.iloc[1504:1508].copy()

然后将列添加到该切片**(但整个DF不会改变)**:

order_1238['customer_name'] = customers

关于为什么不能直接更改切片有很多讨论。

相关问题