Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从csv文件中获取包含每条记录的列表,这些记录包含各行上的多个字符串,并使用python以新行分隔_Python_Pandas_Csv_Dataframe - Fatal编程技术网

如何从csv文件中获取包含每条记录的列表,这些记录包含各行上的多个字符串,并使用python以新行分隔

如何从csv文件中获取包含每条记录的列表,这些记录包含各行上的多个字符串,并使用python以新行分隔,python,pandas,csv,dataframe,Python,Pandas,Csv,Dataframe,我有一个包含多行的CSV文件。问题是有些单元格中有多条记录,它们之间用新行分隔。我希望有一个新的列表或数据框,其中包含各个记录的行 我使用for循环遍历CSV记录,并在循环中使用splitlines()函数分割具有多个由newlies分隔的值的记录。这将给我一个新的列表,其中的子列表位于列表中,用于具有多个由换行符分隔的值的行 以下是我迄今为止所做的工作: import pandas as pd csv_file = 'LineItemsExport-20190805_2326_CDT.csv

我有一个包含多行的CSV文件。问题是有些单元格中有多条记录,它们之间用新行分隔。我希望有一个新的列表或数据框,其中包含各个记录的行

我使用for循环遍历CSV记录,并在循环中使用splitlines()函数分割具有多个由newlies分隔的值的记录。这将给我一个新的列表,其中的子列表位于列表中,用于具有多个由换行符分隔的值的行

以下是我迄今为止所做的工作:

import pandas as pd

csv_file = 'LineItemsExport-20190805_2326_CDT.csv'
dfTemp = pd.read_csv(csv_file)

# keeping only the column we are interested in
df= dfTemp['Modifiers']

# getting rip of nan values
dfCleaned = [x for x in df if str(x) != 'nan']

# splitting rows with more than one value
dfSplitNew = []
for i in range(len(dfCleaned)):
    dfSplitNew.append(dfCleaned[i].splitlines())

# creating dataframe to create an excel file with output values
dfPD = pd.DataFrame(dfSplitNew)
dfSplitNew.to_excel("outputList.xlsx")
让您了解我在CSV中拥有的数据如下:

Index   Modifier  
1       Beef    
2       Chicken  
        Pork  
        Sausage  
3       Beef
鸡肉、猪肉和香肠位于第2行第2列的同一单元格中,并用换行符分隔。我希望我的代码再创建两行,将猪肉和香肠放在不同的记录上

用我现在的代码,只要一行上有多个值,我就会得到一个带有子列表的新列表。我需要一个新行,用于该行中由换行符分隔的每个值

------------更新:解决如下------------

我可以解决创建for循环逐行执行和if语句来检查每行超过1个值的问题,在这些情况下,我使用“extend”函数将所有这些值添加到一个新列表中。代码如下:

# importinng libraries
import pandas as pd
# loading the file
excel_file = 'LineItemsExport-20190805_2326_CDT.csv'
dfTemp = pd.read_csv(excel_file)

# keeping only the column we are interested in
df= dfTemp['Modifiers']

#getting rip of nans
dfCleaned = [x for x in df if str(x) != 'nan']

# splitting newline values into a new list
dfSplitNew = []
for i in range(len(dfCleaned)):
    dfSplitNew.append(dfCleaned[i].splitlines())
#print(dfSplitNew)

# checking row by row and extracting values for rows that has more than one value
dfnew = []
for index in range(len(dfSplitNew)):
    dftemp = dfSplitNew[index]
    if len(str(dftemp)) > 1:
        dfnew.extend(dftemp)
    else:
        dfnew.append(dftemp)

#making the list a dataframe to use pd to export data to xlsx
dfPD = pd.DataFrame(dfnew)
dfPD.to_excel("outputList.xlsx")

由于您使用的是
pandas
,我建议从一开始就使用
pandas
。您可以使用以下方法

import pandas as pd
import numpy as np

df = pd.read_csv('data.txt', sep='\s+')
上面的一行读取带有熊猫的csv文件,我假设分隔符是一个或多个空格,如果不使用字符分隔符替换'sep'的值

nanpos = df['Modifier'].isna()
df['Modifier'] = np.where(nanpos, df['Index'], df['Modifier'])
df['Index'] = np.where(nanpos, np.nan, df['Index'])
df['Index'].fillna(method='ffill', inplace=True)
在这里,数据帧被稍微操纵了一下。由于缺少最后一列中的某些值,因此默认情况下,这些值用
nan
填充。因此,这里要做的是:

  • 切换存在
    nan
    的列值,以便将修饰符值放置在
    'modifier'
    列中,并将
    nan
    值放置在
    'Index'
    列中
  • fillna
    用于将
    nan
    值替换为以前的索引。如果现在打印
    df
    ,您将看到它已变成:

      Index Modifier
    0     1     Beef
    1     2  Chicken
    2     2     Pork
    3     2  Sausage
    4     3     Beef
    
  • 现在,我可以使用索引使用
    groupby
    将值连接在一起:

    ddf = df.groupby('Index').apply(lambda x : ' '.join(x['Modifier']))
    
    ddf
    是:

    Index
    1                    Beef
    2    Chicken Pork Sausage
    3                    Beef
    

    可以显示csv文件的示例吗?当然,示例位于Col1 Col2 NumCol Value 1 Value 2 123下面这是一行,只有一个单元格。这一行正在测试html实体Te
    st 45正如您所看到的,注释位置不正确,无法格式化文本。最好是你的帖子,这样你就可以使用正确的格式了。嗨@Valentino谢谢你的帮助。很抱歉,我在评论上粘贴了表格信息。我现在编辑了这篇文章,并附上了一个表格的例子,但还没有找到一个很好的方式在这里显示表格。我尝试了html和senseful,但都没有正常工作。不管怎样,我用了双空格来创建新线,我想你现在可以知道我有什么了。如果你需要进一步的解释,请告诉我。不,实际上鸡肉、猪肉、香肠和牛肉是四种不同的食物。每行只能有一项。现在,有行(即行索引2),其中有三个项目(鸡肉、猪肉和香肠)由换行符分隔。我需要的是把那些用换行符隔开的物品换成新行单独存放。瓦伦蒂诺,非常感谢你的帮助。我想我没有很好地解释自己,我并不担心“nan”或缺少值,如果是这样的话,我只需要删除它们。我只想提取列修饰符中仅包含在一个单元格中的值。这些值位于同一行内,并由换行符分隔。每行应该只有一个值,并且在某些情况下有多个值。希望我能做到这一点,我会更新我的问题,以显示代码和结果。谢谢你的及时回复,兄弟。好吧,那我就不明白这个问题了。看来你已经解决了。在这种情况下,您可以将您的解决方案作为答案发布并接受它,而不是将其添加到您的问题中。这是通常的做法,人们会立即知道问题已经找到了答案