如何在python中迭代两列?

时间:2015-11-26 15:21:47

标签: python csv pandas

我试图使用python迭代csv文件中的两列?我听说你必须为此导入pandas,但我只是在编码部分挣扎。

import csv as csv
import numpy as np
import pandas as pd

csv_file_object = csv.reader(open('train.csv', 'rb'))  # Load in the csv file
header = csv_file_object.next()                   # Skip the fist line as it is a header
data=[]                                     # Create a variable to hold the data

for row in csv_file_object:                      # Skip through each row in the csv file,
    data.append(row[0:])                        # adding each row to the data variable
data = np.array(data)   



def number_of_female_in_class_3(data):
    for row in data.iterow:
        if row[2] == 'female' and row[4] == '3':
            sum += 1

问题是函数 number_of_female_in_class_3 我想通过两个colunms,我想通过第2列来检查行是否包含字符串' female'并通过第4列并检查状态是否为' 3如果这是真的,那么我想将1增加到总和

我想知道是否有人可以发布一个简单的代码来说明如何实现这个目标?

这是我尝试检索的train.csv文件。

**PassengerID** | **Survived** | **Pclass**   | **Name**  |  **Sex**   |
          1     |          0   |         3    |  mary     |  Female    |
          2     |          1   |         2    |  james    |  Male      |
          3     |          1   |         3    |  Tanya    |  Female    |

谢谢

2 个答案:

答案 0 :(得分:1)

的确,pandas可以帮到你。

我从一个更干净的CSV开始:

PassengerID,Survived,Pclass,Name,Sex
1,0,3,mary,female
2,1,2,james,male
3,1,3,tanya,female

如果您的CSV实际上看起来像您发布的内容(不是真正的CSV),那么您将有一些争吵(见下文)。但如果你可以pandas吃它:

>>> import pandas as pd
>>> df = pd.DataFrame.from_csv('data.csv')
>>> result = df[(df.Sex=='female') & (df.Survived==False)]

结果是新的DataFrame

>>> result
             Survived  Pclass  Name     Sex
PassengerID                                
1                   0       3  mary  female

您可以len(result)获取您之后的计数。

加载CSV

如果您仍然坚持使用那令人讨厌的CSV,那么您可以像df那样得到:{/ p>

# Load using a different delimiter.
df = pd.DataFrame.from_csv('data.csv', sep="|")

# Rename the index.
df.index.names = ['PassID']

# Rename the columns, using X for the bogus one.
df.columns = ['Survived', 'Pclass', 'Name', 'Sex', 'X']

# Remove the 'extra' column.
del df['X']

答案 1 :(得分:0)

我认为这就是你所需要的:

import csv

def number_of_female_in_class_3(data):
    # initialize sum variable
    sum = 0
    for row in data:
        if row[4] == 'Female' and row[2] == '3':
            # match
            sum += 1
    # return the result
    return sum

# Load in the csv file
csv_file_object = csv.reader(open('train.csv', 'rb'), delimiter='|')
# skip the header
header = csv_file_object.next()
data = []

for row in csv_file_object:
    # add each row of data to the data list, stripping excess whitespace
    data.append(map(str.strip, row))

# print the result
print number_of_female_in_class_3(data)

一些解释:

首先,在你的文件中,你有一个大写字母F的女性,其次你的列号是向后的(第5列的性别和第3​​列的类别) 在开始递增之前,需要将sum变量初始化为0。 这里不需要numpy和pandas,尽管你需要将strip函数应用于每行中的每个元素以删除多余的空格(map(str.strip, row))并将delimiter='|'传递给csv.reader,因为默认的分隔符是逗号。最后,在功能结束时需要return sum