如何读取csv文件并将特定行转换为类别列- Pandas

tnkciper  于 12个月前  发布在  其他
关注(0)|答案(2)|浏览(104)

我使用的软件生成由卖家出售的物品的csv报告,但其结构存在问题,如下面的示例所示:
| 产品|数量|单元$|总$|
| --|--|--|--|
| 1 -约翰||||
| 12551 | 1 |五点|五点|
| 14445 | 2 |四点|八点|
| 2 -千斤顶||||
| 1200 | 5 |两点|十点|
| 00155 | 4 |三点|十二点|
我想导入csv并创建一个新的列与卖方信息,但我不知道如何读取文件,存储卖方信息在第二行,通过'卖方'列,并分配'1 -约翰',直到卖方名称更改为'2 -杰克'。
我希望生成以下dataframe:
| 产品|数量|单元$|总$|卖方|
| --|--|--|--|--|
| 12551 | 1 |五点|五点|1 -约翰|
| 14445 | 2 |四点|八点|1 -约翰|
| 1200 | 5 |两点|十点|2 -千斤顶|
| 00155 | 4 |三点|十二点|2 -千斤顶|
我将非常感激你能给予我的任何帮助。

ncgqoxb0

ncgqoxb01#

假设你在使用pd.read_csv后得到了第一个DataFrame,试着:
1.由于其他列对于卖方总是NaN,因此可以使用此列获得卖方名称的Series

  1. ffill创建“卖方”列
  2. drop行,其中数量为NaN
df["Seller"] = df["Product"].where(df["Quantity"].isna()).shift().ffill()
df = df.dropna(subset="Quantity")

>>> df
  Product  Quantity  Unit $  Total $    Seller
1   12551       1.0     5.0      5.0  1 - JOHN
2   14445       2.0     4.0      8.0  1 - JOHN
4    1200       5.0     2.0     10.0  2 - JACK
5   00155       4.0     3.0     12.0  2 - JACK
vxf3dgd4

vxf3dgd42#

您可以尝试如下操作:

  • 使用带有正则表达式模式的Series.str.contains为所有“Sellers”创建一个布尔掩码(m)(True)(有关解释,请参阅here)。
  • 使用Series.wherem作为输入和前向填充(使用Series.ffill)。使用df.assign将其添加到df中,作为“Seller”列。
  • 现在,使用[~m](一元运算符~反转布尔值)从df中仅选择m == False的行,并重置索引(df.reset_index)。
    验证码
# assuming "Seller" entries follow pattern: "1 - NAME1", "2 - NAME2", etc.
m = df['Product'].str.contains('^\d+\s-\s')

out = df.assign(Seller=df['Product'].where(m).ffill())[~m].reset_index(drop=True)

out

  Product  Quantity  Unit $  Total $    Seller
0   12551       1.0     5.0      5.0  1 - JOHN
1   14445       2.0     4.0      8.0  1 - JOHN
2    1200       5.0     2.0     10.0  2 - JACK
3   00155       4.0     3.0     12.0  2 - JACK

如果您确定其他列中的一列将 * 始终 * 包含NaN值,则可以更轻松地执行此操作。请参阅@not_speshal的answer。但是,对于一个从一开始就有明显缺陷的csv文件,您可能希望安全起见。

使用的设置

import pandas as pd
from io import StringIO

s = """Product,Quantity,Unit $,Total $
"1 - JOHN",,,
"12551",1,5.00,5.00
"14445",2,4.00,8.00
"2 - JACK",,,
"1200",5,2.00,10.00
"00155",4,3.00,12.00"""

df = pd.read_csv(StringIO(s))

df

    Product  Quantity  Unit $  Total $
0  1 - JOHN       NaN     NaN      NaN
1     12551       1.0     5.0      5.0
2     14445       2.0     4.0      8.0
3  2 - JACK       NaN     NaN      NaN
4      1200       5.0     2.0     10.0
5     00155       4.0     3.0     12.0

相关问题