【问题标题】:Python data wrangling issuesPython数据争吵问题
【发布时间】:2015-03-03 21:31:38
【问题描述】:

我目前被一些小型数据集的基本问题难住了。下面是前三行来说明数据的格式:

"Sport","Entry","Contest_Date_EST","Place","Points","Winnings_Non_Ticket","Winnings_Ticket","Contest_Entries","Entry_Fee","Prize_Pool","Places_Paid"

"NBA","NBA 3K Crossover #3 [3,000 保证](仅限早期)(1/15)","2015-03-01 13:00:00",35,283.25,"13.33","0.00" ,171,"20.00","3,000.00",35

"NBA","NBA 1,500 上篮 #4 [1,500 保证] (仅早期) (1/25)","2015-03-01 13:00:00",148,283.25,"3.00","0.00" ,862,"2.00","1,500.00",200

使用 read_csv 创建 DataFrame 后遇到的问题:

  1. 某些分类值(例如 Prize_Pool)中存在逗号导致 python 将这些条目视为字符串。我需要将这些转换为浮点数以便进行某些计算。我已经使用了 python 的 replace() 函数来去掉逗号,但这就是我所得到的。

  2. 类别 Contest_Date_EST 包含时间戳,但有些是重复的。我想将整个数据集子集化为一个只有唯一时间戳的数据集。可以选择删除重复条目或条目,但目前我只想能够过滤具有唯一时间戳的数据。

【问题讨论】:

  • 否,csv所有 字段视为字符串。如果您希望它们不是字符串,那么您需要对它们进行后处理。
  • 很高兴知道,但是 python 允许我对其他类别(例如 Entry_Fee)进行基本计算,没有任何问题。你会推荐什么样的后处理?
  • 然后其他东西正在对这些字段进行后处理。也许你应该告诉它后处理其他字段的正确方法。
  • float(row[9].replace(',','')) 有什么问题?
  • 好的,从时间戳类别中过滤掉重复条目怎么样?回复:Clemens - 我收到以下错误:TypeError: cannot convert the series to

标签: python pandas unique dataframe


【解决方案1】:

对包含逗号的数字使用 thousands=',' 参数

In [1]: from pandas import read_csv
In [2]: d = read_csv('data.csv', thousands=',')

您可以检查 Prize_Pool 是数字

In [3]: type(d.ix[0, 'Prize_Pool'])
Out[3]: numpy.float64

要删除行 - 先观察,也可以最后观察

In [7]: d.drop_duplicates('Contest_Date_EST', take_last=False)
Out[7]:
  Sport                                              Entry  \
0   NBA  NBA 3K Crossover #3 [3,000 Guaranteed] (Early ...

      Contest_Date_EST  Place  Points  Winnings_Non_Ticket  Winnings_Ticket  \
0  2015-03-01 13:00:00     35  283.25                13.33                0

   Contest_Entries  Entry_Fee  Prize_Pool  Places_Paid
0              171         20        3000           35

【讨论】:

    【解决方案2】:

    编辑:刚刚意识到您正在使用 pandas - 应该已经看过了。 我暂时把它留在这里,以防万一它适用,但如果它得到 被否决了,我会因同侪压力而将其撤下:)

    今晚晚些时候我会尝试更新它以使用 pandas

    似乎itertools.groupby() 是这项工作的工具;

    这样的?

    import csv
    import itertools
    
    class CsvImport():
    
        def Run(self, filename):
            # Get the formatted rows from CSV file
            rows = self.readCsv(filename)
            for key in rows.keys():
                print "\nKey: " + key
                i = 1
                for value in rows[key]:
                    print "\nValue {index} : {value}".format(index = i, value = value)
                    i += 1
    
        def readCsv(self, fileName):
            with open(fileName, 'rU') as csvfile:
                reader = csv.DictReader(csvfile)
                # Keys may or may not be pulled in with extra space by DictReader()
                # The next line simply creates a small dict of stripped keys to original padded keys
                keys = { key.strip(): key for (key) in reader.fieldnames }
                # Format each row into the final string
                groupedRows = {}
                for k, g in itertools.groupby(reader, lambda x : x["Contest_Date_EST"]):
                    groupedRows[k] = [self.normalizeRow(v.values()) for v in g]
                return groupedRows;
    
        def normalizeRow(self, row):
            row[1] = float(row[1].replace(',','')) # "Prize_Pool"
            # and so on
            return row
    
    
    if __name__ == "__main__":
        CsvImport().Run("./Test1.csv")
    

    输出:

    更多信息:

    https://docs.python.org/2/library/itertools.html

    希望这会有所帮助:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-20
      • 2012-12-12
      • 2021-12-28
      • 1970-01-01
      • 2019-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多