我正在用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|
总的来说,不知道我哪里错了,但会感谢任何帮助!
2条答案
按热度按时间n3h0vuf21#
您可以像这样添加新列:
第一种方法的问题是,你实际上并没有在 Dataframe 中添加列值。仅仅因为列名和变量名相同并不意味着pandas会自动添加这些值。这就是为什么你会在customer_name列下看到NULL值。通过将该列分配给列表
customers
,你可以用相应的值填充该列。eulz3vhy2#
你有两种可能的方法。首先,在整个DF中添加一个
customer_name
列,最初填充的是空字符串:然后在需要的行中添加所需的值:
上面的代码将改变整个dataframe,如果这是你想要的。但是如果你只想有dataframe的一个子集,并添加列,那么你必须首先提取并复制子集
然后将列添加到该切片**(但整个DF不会改变)**:
关于为什么不能直接更改切片有很多讨论。