【问题标题】:remove empty dataframe from list and drop corresponding name in second list从列表中删除空数据框并在第二个列表中删除相应的名称
【发布时间】:2021-06-26 11:43:44
【问题描述】:

我有两个列表,其中第一个是称为名称的字符串列表,是使用相应的 csv 文件的名称生成的。

names = ['ID1','ID2','ID3'] 

我已将 csv 文件加载到单独的 pandas 数据帧中,然后进行了一些预处理,这给我留下了一个列表列表,其中每个元素都是每个数据帧的数据:

dfs = [['car','fast','blue'],[],['red','bike','slow']]

如您所见,预处理后数据帧可能为空,这会导致 dfs 中的列表为空。

我想从这个列表中删除元素并返回它的索引,到目前为止我已经尝试过了,但是在打印 k 时没有得到索引。

k = [i for i,x in enumerate(dfs) if not x]

我需要这个索引的原因是,所以我可以看看删除列表names中对应的索引元素。

最终结果看起来有点像这样:

names = ['ID1','ID3'] 
dfs = [['car','fast','blue'],['red','bike','slow']]

这样我就可以将每个单独的数据框保存为 csv 文件:

for df, name in zip(dfs, names):
    df.to_csv(name + '_.csv', index=False)

编辑:我犯了一个错误:名为 dfs 的列表列表需要从 [''] 更改为 []

【问题讨论】:

  • if not x 不会产生 True,因为列表的值是 ['']。条件if not x 仅在列表为[] 且内部没有任何内容时才会触发。
  • 删除熊猫,因为与熊猫无关
  • 你的 for 循环 for df, name in zip(dfs,names) 只是一个列表循环。所以df 并不是一个真正的数据框。 for 循环内的行 df.to_csv(name +...) 将不起作用。你确定它会起作用吗?
  • @JoeFerndz 是的,这部分代码有效。
  • @msa 我的编辑有帮助吗?

标签: python python-3.x list indexing


【解决方案1】:

可以使用内置的any()方法:

k = [i for i, x in enumerate(dfs) if not any(x)]

你的原因

k = [i for i, x in enumerate(dfs) if not x]

不起作用是因为,无论列表中有什么,只要列表不为空,列表的truthy value 将是True。

any() 方法将接收一个数组,并返回数组中的 任何 元素是否具有 True 的真值。如果数组没有这样的元素,它将返回False。空字符串''的thruthy值为False。

编辑:问题已编辑,这是我的更新答案:

您可以尝试创建新列表:

names = ['ID1','ID2','ID3'] 
dfs = [['car','fast','blue'],[],['red','bike','slow']]

new_names = list()
new_dfs = list()

for i, x in enumerate(dfs):
    if x:
        new_names.append(names[i])
        new_dfs.append(x)

print(new_names)
print(new_dfs)

输出:

['ID1', 'ID3']
[['car', 'fast', 'blue'], ['red', 'bike', 'slow']]

如果不起作用,请尝试在循环中添加print(x) 以查看发生了什么:

names = ['ID1','ID2','ID3'] 
dfs = [['car','fast','blue'],[],['red','bike','slow']]

new_names = list()
new_dfs = list()

for i, x in enumerate(dfs):
    print(x)
    if x:
        new_names.append(names[i])
        new_dfs.append(x)

【讨论】:

    【解决方案2】:

    由于您已经在使用 enumerate ,因此您不必再次循环。

    希望这能解决您的问题:

    names = ['ID1', 'ID2', 'ID3']
    dfs = [['car', 'fast', 'blue'], [''], ['red', 'bike', 'slow']]
    
    
    for index, i in enumerate(dfs):
        if len(i) == 1 and '' in i:
            del dfs[index]
            del names[index]
    
    print(names)
    print(dfs)
    
    # Output
    # ['ID1', 'ID3']
    # [['car', 'fast', 'blue'], ['red', 'bike', 'slow']]
    

    【讨论】:

    • 小心,如果有很多值,其中一个恰好是'',它可能会删除索引
    • 我认为这可能是个问题。我没有太多使用熊猫,我认为它总是''如果它是空的。
    • 另外,在使用 for 循环遍历列表时尽量不要操作列表
    【解决方案3】:

    我认为问题是因为['']。

    l = ['']
    len(l)
    

    输出为1。因此,

    not l
    

    给False

    如果你确定只有[''],那么试试

    dfs = [['car','fast','blue'],[''],['red','bike','slow']]
    
    k = [i for i,x in enumerate(dfs) if len(x)==1 and x[0]=='']
    

    这给出了[1] 作为输出

    或者你可以试试any(x)

    【讨论】:

      【解决方案4】:

      查看提供的数据,我将执行以下操作:

      第 1 步:检查列表是否有任何值。如果是这样,if df 将是 True。

      第 2 步:获得列表后,创建一个数据框并写入 csv。

      代码如下:

      names = ['ID1','ID2','ID3'] 
      dfs = [['car','fast','blue'],[],['red','bike','slow']]
      
      dfx = {names[i]:df for i,df in enumerate(dfs) if df)}
      
      import pandas as pd
      for name,val in dfx.items():
          df = pd.DataFrame({name:val})
          df.to_csv(name + '_.csv', index=False)
      

      【讨论】:

        猜你喜欢
        • 2021-11-06
        • 2018-01-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-07-11
        • 2018-12-25
        • 1970-01-01
        • 2012-10-26
        相关资源
        最近更新 更多