首页 > 解决方案 > 基于逗号将单列的值打印到 d/f 列

问题描述

我正在处理一个 csv 文件,并且一列由逗号分隔的一个到多个整数值组成。首先,代码将能够根据逗号知道行中的最大值。之后,它将生成名称为 a/c 的列的最大值。最后,它将能够在新列中打印值。我正在处理大数据。

INPUT
col  column-name vvs
x12  2,3,4       ab
d3   4           fd
3fd  2,5,8,6     cf
5r4  3,2         mg

以下是我尝试编写的代码

a=read_file("xyz.csv") #READ FILE IS A FUNCTION AND IT WORKS PROPERLY
print(a["column-name"].max())
def dfmax(dfcl):
    cl=0
    t=[]
    for i in range(dfcl.size):
        b=dfcl[i]
        c=b.split(",")
        if len(c) > cl :
            cl=len(c)
            t=b
    print(cl)
    print(t)
    return cl

c=dfmax(a["column-name"])
print(c)


for i in range(c):
        a.insert(5+i,"A"+str(i+1),a["column-name"],True) #CODE IS WORKING FINE TILL HERE IT IS PRINTING MAXIMUM LENGTH
#I assume just to check the code that the maximum values in the column 5
c=5
#for i in range(a["column-name"].size):
for i in range(20):
    b=a["column-name"][i]
    cb=b.split(",")
    for j in range(c):
        if j < len(cb):
            st = "A"+str(j+1)
            #print(st)
            a[st][i]=cb[j]
        else:
            a[st][i]=""

  DESIRED OUTPUT
    col  column-name column-name-2 column-name-3 column-name-4  vvs
    x12  2           3             4                            ab
    d3   4                                                      fd
    3fd  2           5             8             6              cf
    5r4  3           2                                          mg

不幸的是,代码无法正常工作。它提供以下错误。如果有更简单的方法来完成这项任务,请告诉我。

C:\Users\abc\Anaconda3\lib\site-packages\ipykernel_launcher.py:10: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame

See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy
  # Remove the CWD from sys.path while we load stuff.
C:\Users\abc\Anaconda3\lib\site-packages\ipykernel_launcher.py:12: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame

See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy
  if sys.path[0] == '':

标签: pythonloops

解决方案


这是使用 pandas 从 .csv 加载数据并创建所需输出的示例。我使用 np.nan 用“空”数据填充空白点。

import pandas as pd
import numpy as np

df = pd.read_csv(r"<PATH TO YOUR CSV>")
for row, item in enumerate(df["column-name"]):
    l = item.split(",")
    for idx, elem in enumerate(l):
        col = "column-name-%s" % idx
        if col not in df.columns:
            df[col] = np.nan
        df[col][row] = elem

df = df.drop(columns=["column-name"])

print(df)

在这里,我们首先检查数据框中的所有行,以获取“列名”列以获取逗号分隔值和行号。之后,我们将其拆分以获取该单元格中所有数字的列表。
现在我们检查我们的列表并记住数字在哪个位置(idx),所以我们知道它属于哪一列。现在我们知道了该列,我们检查它是否已经存在。如果存在,我们只需将我们的值添加到相应的行。否则,我们创建一个新列并首先用空数据填充它。

这给了我们以下输出:

   col vvs  column-name-0  column-name-1  column-name-2  column-name-3
0  x12  ab            2.0            3.0            4.0            NaN
1   d3  fd            4.0            NaN            NaN            NaN
2  3fd  cf            2.0            5.0            8.0            6.0
3  5r4  mg            3.0            2.0            NaN            NaN

希望能帮助到你。


推荐阅读