读取csv空间的倍数

2024-05-13 06:23:18 发布

您现在位置:Python中文网/ 问答频道 /正文

enter image description here

我在csv文件中有一个非常相似的数据集,有两列

例如: 在第一行和第一列 项目:“Betarlaga paquete 5大学”

在第一行和第二列 数量:1

Item    qty
Betarraga paquete 5 unidades    1
Betarraga paquete 5 unidades    2
Betarraga paquete 5 unidades    1
Betarraga paquete 5 unidades    1
CANASTA PEQUEÑA 1
Cebolla Nueva 20 unidades   1
Cebolla Nueva 20 unidades   2
Cebolla Nueva 20 unidades   1
Cebollin atado de 3 2
Cebollin atado de 3 2
Cebollin atado de 3 3
Cebollin atado de 3 1
Cebollin atado de 3 1
Cebollin atado de 3 1
Cebollin atado de 3 1

我喜欢与熊猫一起阅读,但使用:

     df1 = pd.read_csv(r'pedidos4.csv',sep='\s+',encoding='utf-8',error_bad_lines=False)  

这只返回2列,但第一列输入中的第一个单词作为rowname

enter image description here

  df.shape
  (15, 2)

Tags: 文件csv数据项目数量de大学paquete
2条回答

我假设您希望每行的最后一个元素是第2列,其余元素在第1列。因此,您可能必须手动执行此操作,因为不同行的空白量不一致,而且我认为标准的read_csv方法不容易实现。因此,这里有一个替代方案

这是我们的数据

file = StringIO(
"""Item    qty
Betarraga paquete 5 unidades    1
Betarraga paquete 5 unidades    2
Betarraga paquete 5 unidades    1
Betarraga paquete 5 unidades    1
CANASTA PEQUEÑA 1
Cebolla Nueva 20 unidades   1
Cebolla Nueva 20 unidades   2
Cebolla Nueva 20 unidades   1
Cebollin atado de 3 2
Cebollin atado de 3 2
Cebollin atado de 3 3
Cebollin atado de 3 1
Cebollin atado de 3 1
Cebollin atado de 3 1
Cebollin atado de 3 1
""")

#If 'myfile.txt' is where this data is, you should replace the above with
# file = open('myfile.txt', 'r')

然后,我们逐行读取file,在空白处拆分该行,使用最后一个标记作为第2列,其余标记作为第1列,并插入一个数据帧

col1 = []
col2 = []
for line in file:
    tokens = line.split()
    c1 = ' '.join(tokens[:-1])
    c2 = tokens[-1]
    col1.append(c1)
    col2.append(c2)

df = pd.DataFrame({col1[0] : col1[1:], col2[0] : col2[1:]})
df['qty'] = df['qty'].astype(int)
df

产生


    Item                            qty
                     -
 0  Betarraga paquete 5 unidades      1
 1  Betarraga paquete 5 unidades      2
 2  Betarraga paquete 5 unidades      1
 3  Betarraga paquete 5 unidades      1
 4  CANASTA PEQUEÑA                   1
 5  Cebolla Nueva 20 unidades         1
 6  Cebolla Nueva 20 unidades         2
 7  Cebolla Nueva 20 unidades         1
 8  Cebollin atado de 3               2
 9  Cebollin atado de 3               2
10  Cebollin atado de 3               3
11  Cebollin atado de 3               1
12  Cebollin atado de 3               1
13  Cebollin atado de 3               1
14  Cebollin atado de 3               1

我能够准确地阅读你作为两列发布的文本块。请尝试使用sep='\s\s+'

之后,您可以编写一个函数,该函数接受一行,检查qty是否为null,修复qty列和Item列并返回该行。然后您可以将其应用于df上的axis=1

Item    qty
Betarraga paquete 5 unidades    1
Betarraga paquete 5 unidades    2
Betarraga paquete 5 unidades    1
Betarraga paquete 5 unidades    1
CANASTA PEQUEÑA 1
Cebolla Nueva 20 unidades   1
Cebolla Nueva 20 unidades   2
Cebolla Nueva 20 unidades   1
Cebollin atado de 3 2
Cebollin atado de 3 2
Cebollin atado de 3 3
Cebollin atado de 3 1
Cebollin atado de 3 1
Cebollin atado de 3 1
Cebollin atado de 3 1
df = pd.read_clipboard('\s\s+')

#Then use fix to fix the qty values

def fix(row):
    if pd.isnull(row['qty']):
        row['qty']=row['Item'][-1:]
        row['Item']=row['Item'][:-1].strip()
    return row

fixed_df = df.apply(fix, axis=1)
print(fixed_df)
                            Item qty
0   Betarraga paquete 5 unidades   1
1   Betarraga paquete 5 unidades   2
2   Betarraga paquete 5 unidades   1
3   Betarraga paquete 5 unidades   1
4               CANASTA PEQUEÑA    1
5      Cebolla Nueva 20 unidades   1
6      Cebolla Nueva 20 unidades   2
7      Cebolla Nueva 20 unidades   1
8           Cebollin atado de 3    2
9           Cebollin atado de 3    2
10          Cebollin atado de 3    3
11          Cebollin atado de 3    1
12          Cebollin atado de 3    1
13          Cebollin atado de 3    1
14          Cebollin atado de 3    1

相关问题 更多 >