我有一个非常有效的代码,直到获得的csv文件在此特定列中为空为止。我试图纠正,但是它不起作用。
我的代码应该做的是将序列号拆分为同一项目缺少的行。当列中至少有1个序列号时,它将工作在应有的位置,其余则为空。如果它们更多,它也可以工作,但是如果没有更多的话,它就不起作用:/ 所以我尝试了这个:
function = (lambda x: x['SerialNumbers']
if x['SerialNumbers'] is numpy.nan
else x['SerialNumbers'][x['count']])
copySerial = updated_csv['SerialNumbers'].copy()
if not (copySerial is numpy.nan):
function = (lambda x: x['SerialNumbers']
if x['SerialNumbers'] is numpy.nan
else x['SerialNumbers'][x['count']])
updated_csv['SerialNumbers'] = updated_csv['SerialNumbers'].str.split(' ')
updated_csv['SerialNumbers'] = updated_csv.apply(function, axis=1)
是否有东西进入如果条件
我也尝试过这个: -基于上面的函数和copySerial:
updated_csv['SerialNumbers'] = numpy.where((copySerial != '')|(copySerial != 'nan') ,updated_csv['SerialNumbers'].str.split(' '), updated_csv['SerialNumbers'])
updated_csv['SerialNumbers'] = numpy.where((copySerial != '')|(copySerial != 'nan'), updated_csv.apply(function, axis=1), updated_csv['SerialNumbers'])
另外,再次进入内部时,我尝试使用原始列执行if条件,但是它不起作用。我不知道如何纠正它。
我也尝试过这个:
if [~updated_csv['SerialNumbers'].empty]:
但同样没有用
任何帮助都很好
编辑: 这里要求的是应使用的csv文件示例:
Auftragsdatum;Auftrags-Nr.;Ihre Referenz;Auftragswert;Pos.;Menge;Art.Nr.;Herst.Nr.;Produktname;Ihre Referenz (Position);Netto / Stk.;Rechn.-Nr.;Liefers.-Nr.;Serien-Nr.;Hersteller
20.11.2019;703;;1056,36;100;2;3441223;abc;APC Smart-UPS;;820,4;;;123 122;APC
20.11.2019;703;;1056,36;200;1;1492133;cde;APC UPS;;224,88;;;;APC
20.11.2019;703;;1056,36;300;1;7000061;;Frachtkosten automatisch;;8,99;;;;;
20.11.2019;703;;1056,36;400;1;7003581;;Mautgebühr;;2,09;;;;;
在原始csv中,该列称为 Serien-Nr 。在Serien-Nr列的第一行中。有2个序列号称为 123122 ,我想复制第一行,因为数量(即Menge)为2,然后将每一行的序列号分开
所以最终外观应该是:
Auftragsdatum;Auftrags-Nr.;Ihre Referenz;Auftragswert;Pos.;Menge;Art.Nr.;Herst.Nr.;Produktname;Ihre Referenz (Position);Netto / Stk.;Rechn.-Nr.;Liefers.-Nr.;Serien-Nr.;Hersteller
20.11.2019;703;;1056,36;100;2;3441223;abc;APC Smart-UPS;;820,4;;;123;APC
20.11.2019;703;;1056,36;100;2;3441223;abc;APC Smart-UPS;;820,4;;;122;APC
20.11.2019;703;;1056,36;200;1;1492133;cde;APC UPS;;224,88;;;;APC
20.11.2019;703;;1056,36;300;1;7000061;;Frachtkosten automatisch;;8,99;;;;;
20.11.2019;703;;1056,36;400;1;7003581;;Mautgebühr;;2,09;;;;;
但如果没有序列号,则应仅复制行数以获取数量
答案 0 :(得分:0)
这是您要找的东西吗?我认为您在熊猫里拥有一切:
from io import StringIO
import pandas as pd
csv_file = StringIO("""Auftragsdatum;Auftrags-Nr.;Ihre Referenz;Auftragswert;Pos.;Menge;Art.Nr.;Herst.Nr.;Produktname;Ihre Referenz (Position);Netto / Stk.;Rechn.-Nr.;Liefers.-Nr.;Serien-Nr.;Hersteller
20.11.2019;703;;1056,36;100;2;3441223;abc;APC Smart-UPS;;820,4;;;123 122;APC
20.11.2019;703;;1056,36;200;1;1492133;cde;APC UPS;;224,88;;;;APC
20.11.2019;703;;1056,36;300;1;7000061;;Frachtkosten automatisch;;8,99;;;;
20.11.2019;703;;1056,36;400;1;7003581;;Mautgebühr;;2,09;;;;""")
df = pd.read_csv(csv_file,sep=";")
temp_df = pd.DataFrame(columns=df.columns)
for index,row in df.iterrows():
if row["Menge"] > 1: # check if count is bigger than one. all row["Menge"] could also replaced with len(df["Serien-Nr."].split(" "))
split_serial = row["Serien-Nr."].split(" ")
df.loc[index,"Serien-Nr."] = split_serial[0]
for m in range(1,row["Menge"]): # for loop in case that there are more serial numbers than only two
row["Serien-Nr."] = split_serial[m]
temp_df = temp_df.append(row)
df = pd.concat([temp_df,df],axis=0).reset_index()
输出print(df)
Auftragsdatum Auftrags-Nr. ... Serien-Nr. Hersteller
0 20.11.2019 703 ... 122 APC
1 20.11.2019 703 ... 123 APC
2 20.11.2019 703 ... NaN APC
3 20.11.2019 703 ... NaN NaN
4 20.11.2019 703 ... NaN NaN
第一部分只是将数据读入熊猫。我没有使用任何重命名,所以我的Serien-Nr.
是您的SerialNumbers
,而您的count
是我的Menge
我遍历df,当count/Menge
大于1时,我进行拆分并将所有新行(如果count/Menge
大于3或更大)添加到新的df中。
最后,我将两个df加在一起。
编辑:您也可以跳过无关紧要的tmp df的创建。并且请注意,新添加的行不在原始行的下方/上方。因此,如果那很重要,那么您必须随后订购。