Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/288.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.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中基于唯一键和条件创建新数组_Python_Excel_Indexing_Match - Fatal编程技术网

在Python中基于唯一键和条件创建新数组

在Python中基于唯一键和条件创建新数组,python,excel,indexing,match,Python,Excel,Indexing,Match,我计划用Python而不是Excel来计算大量数据,但我被卡住了,因为我知道Excel命令,而且我很难用Python复制它 基本上,我想导入CSV文件,确定C列的位置,然后对于A列中的所有唯一值,将C中适用于B中条件1990

我计划用Python而不是Excel来计算大量数据,但我被卡住了,因为我知道Excel命令,而且我很难用Python复制它

基本上,我想导入CSV文件,确定C列的位置,然后对于A列中的所有唯一值,将C中适用于B中条件
1990
的所有值相加

A,B,C
9,1952,125
2,1994,69
3,1973,72
5,1992,85
1,1994,38
1,1994,95
4,1992,29
8,1984,94
我首先说:

import csv
with open('TestCase.txt', 'rb') as csvfile:
    reader = csv.reader(csvfile, delimiter=',')
    row1 = next(reader)
我不想编写多个
if
语句,而是创建由0和1组成的新数组,然后用C对所有值求和

如果给定另一个条件,结果将如下所示

1980<x<1989 94
1990<x<2000 316
1980您可以使用:

l = list()
d = dict()
with open('TestCase.txt', 'r') as file:
    for line in file:
        l.append(line.rstrip("\n").split(',')) # l=[[9,1952,125],[2,1994,69],...]

    for item in l:
        if 1990 < int(item[1]) < 2000: # The desired condition for colum B 
            d[item[0]] = d[item[0]] + int(item[2]) if item[0] in d else int(item[2])
l=list()
d=dict()
以open('TestCase.txt','r')作为文件:
对于文件中的行:
l、 追加(line.rstrip(“\n”).split(“,”)#l=[91952125],[21994,69],…]
对于l中的项目:
如果1990

d
字典将
A
的唯一值作为其键,将
C
的和作为其值。

如果您愿意使用第三方库,可以通过
pandas
对其进行矢量化:

import pandas as pd

# read csv file
df = pd.read_csv('file.csv')

# filter column B, group by A, sum C
res = df.loc[df['B'].between(1990, 2000)]\
        .groupby('A')['C'].sum()\
        .reset_index()
结果:

   A    C
0  1  133
1  2   69
2  4   29
3  5   85
从io导入StringIO
作为pd进口熊猫
txt=StringIO(“”)
A、 B,C
9,1952,125
2,1994,69
3,1973,72
5,1992,85
1,1994,38
1,1994,95
4,1992,29
8,1984,94
""")
df=pd.read\u csv(txt)
#条件=(df[“B”]>1980)和(df[“B”]<1989)
条件=(df[“B”]>1990)和(df[“B”]<2000)
df_cond=df[条件]
df_uniq=df_cond.drop_duplicates('A',keep=False)
df_uniq_keep_first=df_cond.drop_duplicates('A',keep=“first”)
df_uniq_keep_last=df_cond.drop_duplicates('A',keep=“last”)
sum_dupl=df_cond[“C”]。sum()
sum_uniq=df_uniq[“C”]。sum()
sum_uniq_keep_first=df_uniq_keep_first[“C”]。sum()
sum_uniq_keep_last=df_uniq_keep_last[“C”]。sum()
打印(“带副本的总和:+str(总和))#316
打印(“sum pure unique:+str(sum uniq))#183
打印(“sum unique keep first:+str(sum uniq_keep first))#221
打印(“sum unique keep last:+str(sum uniq_keep last))#278

您对输出的期望是什么?我可以帮你。是否要将唯一值归档?@mehrdad pedramfar最终,我希望看到C中应用B所述条件的值的总和。下一步是添加另一个条件,例如。1980@ThomasJunk不可以。总和必须包含所有值。@energyMax我发布了一个答案,它返回一个字典。你还需要什么吗?告诉我我会更新我的答案。这是有效的,但条件是1990谢谢。如果我导入txt,这将如何工作?我应该使用导入CSV并在其上使用StringIO函数吗?filename=“file\u to\u import.CSV”df=pd.read\u CSV(filename)我使用StringIO只是为了将文本变量“转换”为演示代码的文件。i、 e.您不需要从io导入字符串。它很有魅力。在这种情况下,“df_cond.drop_duplicates”命令有什么作用?我试图满足您的要求“考虑所有值”-因此没有唯一值。我刚刚编辑了演示代码,介绍了如何处理重复项{False,“first”,“last”}的各种方法。正如您可以看到的条件=(df[“B”]>1990)和(df[“B”]<2000),处理重复项的方式具有重要的后果。
   A    C
0  1  133
1  2   69
2  4   29
3  5   85
from io import StringIO
import pandas as pd

txt = StringIO("""
A,B,C
9,1952,125
2,1994,69
3,1973,72
5,1992,85
1,1994,38
1,1994,95
4,1992,29
8,1984,94
""")

df = pd.read_csv(txt )

#condition = (df["B"] >1980) & (df["B"] < 1989)
condition = (df["B"] >1990) & (df["B"] < 2000)
df_cond = df[condition]

df_uniq = df_cond.drop_duplicates('A', keep=False)
df_uniq_keep_first = df_cond.drop_duplicates('A', keep="first")
df_uniq_keep_last = df_cond.drop_duplicates('A', keep="last")

sum_dupl = df_cond["C"].sum()
sum_uniq = df_uniq["C"].sum()
sum_uniq_keep_first = df_uniq_keep_first["C"].sum()
sum_uniq_keep_last = df_uniq_keep_last["C"].sum()

print("sum with duplicates  : " + str(sum_dupl))            #316
print("sum pure unique      : " + str(sum_uniq))            #183
print("sum unique keep first: " + str(sum_uniq_keep_first)) #221 
print("sum unique keep last : " + str(sum_uniq_keep_last))  #278