csv文件中的Python分析列和单元格中的数据
我正在尝试为以下数据创建代码: 我已使用以下代码导入数据:csv文件中的Python分析列和单元格中的数据,python,csv,Python,Csv,我正在尝试为以下数据创建代码: 我已使用以下代码导入数据: import csv import itertools import pandas as pd input_file="computation.csv" cmd=pd.read_csv(input_file) subset = cmd[['Carbon A', 'Carbon B']] carbon_pairs = [tuple(y) for y in subset.values] c_pairs = carbon_pairs 我
import csv
import itertools
import pandas as pd
input_file="computation.csv"
cmd=pd.read_csv(input_file)
subset = cmd[['Carbon A', 'Carbon B']]
carbon_pairs = [tuple(y) for y in subset.values]
c_pairs = carbon_pairs
我想创建一个具有以下输出的代码:
1 is connected to
2
4
6
7
8
2 is connected to
1
4
5
请注意,对于“carbon”2,我希望它重复连接到carbon 1。我想一些排列可以显示这一点,但我很不确定从哪里开始。基本上,代码需要输出:
for every cell with the same value, print adjacent cell
从问题的结尾开始:
c_pairs = [(1, 2), (1, 4), (1, 6), (1, 7), (1, 8), (2, 1), (2, 4), (2, 5)]
你可能想得到更像这样的结果:
groups = {1: [2, 4, 6, 7, 8], 2: [1, 4, 5]}
有很多方法可以达到这个目的
如果您知道您的数据已排序,则可以使用itertools.groupby
,例如:
first_item = lambda (a, b): a
for key, items in itertools.groupby(c_pairs, first_item):
print '%s is connected to' % key
for (a, b) in items:
print ' %s' % b
如果您的数据未排序,这可能仍然是最快的方法,只需先排序即可:
c_pairs = sorted(c_pairs, key=first_item)
一个更适合自己动手的解决方案是使用defaultdict
或标准字典创建一个到另一个的映射
groups = collections.defaultdict(list)
for a, b in c_pairs:
groups[a].append(b)
这相当于没有集合:
groups = {}
for a, b in c_pairs:
groups.setdefault(a, []) # many ways to do this as well
groups[a].append(b)
通过以下函数(Python 2),您可以在不依赖pandas的情况下获得所需的输出,该函数允许您传入所需的任何文件名,并使用您试图查询的索引(基于零)进行控制。此解决方案假定数据按照您提供的示例中的方式进行排序
import csv
def printAdjacentNums(filename, firstIdx, secondIdx):
with open(filename, 'rb') as csvfile:
# handle header line
header = next(csvfile)
reader = csv.reader(csvfile)
current_val = ''
current_adj = []
# dict of lists for lookback
lookback = {}
for row in reader:
if current_val == '':
current_val = row[firstIdx]
if row[firstIdx] == current_val:
current_adj.append(row[secondIdx])
else:
# check lookback
for k, v in lookback.items():
if current_val in v:
current_adj.append(k)
# print what we need to
print current_val + ' is connected to'
for i in current_adj:
print i
# append current vals to lookback
lookback[current_val] = current_adj
# reassign
current_val = row[firstIdx]
current_adj = [row[secondIdx]]
# print final set
for k, v in lookback.items():
if current_val in v:
current_adj.append(k)
print current_val + ' is connected to'
for i in current_adj:
print i
然后根据您的示例,这样称呼它:
printAdjacentNums('computation.csv', 0, 1)
我建议简化您的问题,并将背景故事放在下面:“给定一个
(a,b)
对的列表,如[(1,2),(1,4),(1,6),(1,7),(1,8),(2,1),(2,1),(2,4),(2,5)]
,我如何找到与每个a
值关联的所有b
值?”!但是(例如),它打印“2连接到:4,5”,我想包括它连接到1(第一行)。你知道如何添加这个吗?添加了回溯逻辑。此逻辑不处理重复行,因为这不在原始问题的范围内。如果需要,请使用而不是列表作为当前_adj的数据类型。希望这有帮助。有没有办法向itertools.groupby添加某种类型的回溯逻辑?正如你所说,我想以groups={1:[2,4,6,7,8],2:[1,4,5]}结束,但是这个代码给了我groups={1:[2,4,6,7,8],2:[4,5]}@AlexIndeglia哪个代码?根据您的阅读方式,上面有3-4个选项。当运行除一个版本之外的所有版本时,我可以看到上面所需的输出。在这个例子中,您对未排序的数据运行了groupby
,而没有运行上面调用的about行,并且该代码不返回字典,而是在打印的循环中使用。您确定没有忘记添加(2,1)
值吗?