Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/352.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
python-将列表与csv进行比较_Python - Fatal编程技术网

python-将列表与csv进行比较

python-将列表与csv进行比较,python,Python,我有这个.csv: col1,col2,col3,col4,col5 247,19,1.0,2016-01-01 14:11:21,MP 247,3,1.0,2016-01-01 14:23:43,MP 247,12,1.0,2016-01-01 15:32:16,MP 402,3,1.0,2016-01-01 12:11:15,? 583,12,1.0,2016-01-01 02:33:57,? 769,16,1.0,2016-01-01 03:12:24,? 769,4,1.0,2016-0

我有这个.csv:

col1,col2,col3,col4,col5
247,19,1.0,2016-01-01 14:11:21,MP
247,3,1.0,2016-01-01 14:23:43,MP
247,12,1.0,2016-01-01 15:32:16,MP
402,3,1.0,2016-01-01 12:11:15,?
583,12,1.0,2016-01-01 02:33:57,?
769,16,1.0,2016-01-01 03:12:24,?
769,4,1.0,2016-01-01 03:22:29,?
.....
我需要为每个col1 unique元素获取col2值,并创建一个新的.csv,如下所示:

expected output:
19,3,12
3
12
16,4
...
也就是说,我想输出数字,直到看到一个非唯一的值,此时我将开始一个新行并继续输出数字

我以这种方式读取.csv,并从列表中删除了副本:

import pandas as pd
colnames = ['col1', 'col2', 'col3', 'col4', 'col5']
df = pd.read_csv('sorted.csv', names=colnames)
list1 = df.col1.tolist()
list2 = list(set(list1 ))

现在事情对我来说越来越难了,我是python新手,我的想法是将list2中的每个元素与df中的每一行进行比较,并在一个新的.csv中编写col2元素,你能帮我吗?

你需要跟踪你的副本。最简单的方法(如易于理解,但牺牲了一些效率)如下

import pandas as pd
colnames = ['col1', 'col2', 'col3', 'col4', 'col5']
df = pd.read_csv('sorted.csv', names=colnames)

list1 = df.col2.tolist()
dup_tracker = []
for x in list1:
    if x in dup_tracker: file_out_helper('\n')
    file_out_helper(str(x) + ', ')
    dup_tracker.append(x)

def file_out_helper(m_str):
    tgtfile = 'my_target_file.csv'
    with open(tgtfile,'a') as f: f.write(m_str)

你需要跟踪你的副本。最简单的方法(如易于理解,但牺牲了一些效率)如下

import pandas as pd
colnames = ['col1', 'col2', 'col3', 'col4', 'col5']
df = pd.read_csv('sorted.csv', names=colnames)

list1 = df.col2.tolist()
dup_tracker = []
for x in list1:
    if x in dup_tracker: file_out_helper('\n')
    file_out_helper(str(x) + ', ')
    dup_tracker.append(x)

def file_out_helper(m_str):
    tgtfile = 'my_target_file.csv'
    with open(tgtfile,'a') as f: f.write(m_str)

您可以通过将数据分组,然后应用
set
函数作为聚合来实现这一点

df.groupby('col1')['col2'].apply(set).apply(list)

apply(set)
函数为每个
col1
值创建一组所有不同的
col2
元素,然后
apply(list)
函数将该集合转换为一个列表。

您可以通过将数据分组,然后应用
set
函数作为聚合来完成此操作

df.groupby('col1')['col2'].apply(set).apply(list)
apply(set)
函数为每个
col1
值创建一组所有不同的
col2
元素,然后
apply(list)
函数将集合转换为列表

python3中的示例

也许,你可以试试这个。不要将整个输出存储在列表或任何数据结构中(内存问题)。在读取和聚合时写入文件。(如果可能,还应优化读取以获得迭代器,而不是从输入文件一次加载整个内容。)

python3中的示例



也许,您可以尝试一下。不要将整个输出存储在列表或任何数据结构中(内存问题)。在读取和聚合时写入文件。(如果可能,还应优化读取以获得迭代器,而不是从输入文件一次加载整个内容。

您希望写入csv的df的预期输出是什么?您只需要每行的第一项和第二项。将它们存储在更有用的数据结构中。然后迭代以生成输出。如果r对于第1列的某个值,预期输出应为第2列的所有值,为什么要删除第1列的重复值?这不会导致第2列中只有一个值对应于第1列中的值吗?请澄清您的预期结果,以便我们能够解决此问题。请提供一个示例输出,我将构建一个可能的答案e示例输出在第一篇文章中:“我需要为每个col1惟一元素获取col2值,并创建一个新的.csv,如下所示:”,所以我只需要一个带有该序列的.csv文件,每一行都应该是col1中单个值的序列。您希望写入csv的df的预期输出是什么?您只需要每一行的第一项和第二项。将它们存储在更有用的数据结构中。然后迭代以生成输出。如果您的预期输出应该是e所有第2列的值对于第1列的某个值,为什么要删除第1列的重复值?这不会导致第2列中只有一个值对应于第1列中的某个值吗?请澄清您的预期结果,以便我们可以解决此问题。请提供一个示例输出,我将构建一个可能的答案示例输出在fi中rst post:“我需要为每个col1唯一元素获取col2值,并创建一个新的.csv文件,如下所示:”,因此我只需要一个带有该序列的.csv文件,每一行都应该是col1Hi中单个值的序列,
导入熊猫作为pd COLNAME=['col1',col2',col3',col4',col5']df=pd.read_csv('sorted.csv',names=colnames)对于df.groupby('col1')['col2'].apply(set).apply(list):print“,”.join(map(str,value))中的值
打印以下19,3,12 3 12 4,16 col2,即使标题行包含在output@AbinayaDevarajan-标题是否包含在您的
排序.csv
文件中?似乎是这样。您正在
read\u csv
中设置
name
参数,默认情况下,该参数将设置
header=None
,这将将标题信息作为数据中的一行重新创建第一行。您好,
import pandas as pd colnames=['col1','col2','col3','col4','col5']df=pd.read\u csv('sorted.csv',names=colnames)作为df.groupby('col1')['col2']中的值。apply(set)。apply(list):print“,”。join(map(str,value))
打印以下19,3,12 3 12 4,16 col2,即使标题行包含在output@AbinayaDevarajan-标题是否包含在您的
排序.csv
文件中?似乎是这样。您正在
read\u csv
中设置
name
参数,默认情况下,该参数将设置
header=None
,这将将标题信息作为数据中的一行重新创建第一行。这几乎是完美的!有没有办法删除文件中的空行?实际上,我在行与行之间有一个空行,带有类似于df.dropna()的元素,您在寻找什么?@Nivii1406似乎不起作用,我得到以下错误:“ParserError:Error Tokenized data.C错误:第9行中应有3个字段,第9行中有4个”我在行中有4个数字,我已通过在“w”之后添加',newline=''来解决“在使用open时,感谢您的帮助!这几乎是完美的!是否有任何方法可以删除文件中的空行?实际上,我在行与行之间有一个空行,带有类似于df.dropna()的元素,您在寻找什么?@Nivii1406似乎不起作用,但我得到以下错误:“ParserError:错误标记化数据。C错误:第9行中预期有3个字段,第9行中看到了4个”我在行中有4个数字,我已通过在“w”后面加上',newline=''解决了这个问题,使用open,感谢您的帮助!