如果空列上的条件不起作用-python

时间:2019-12-17 12:20:02

标签: python pandas numpy csv

我有一个非常有效的代码,直到获得的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;;;;;

但如果没有序列号,则应仅复制行数以获取数量

1 个答案:

答案 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的创建。并且请注意,新添加的行不在原始行的下方/上方。因此,如果那很重要,那么您必须随后订购。