根据pandas数据帧的索引定义列表

时间:2014-07-17 00:01:47

标签: python pandas

我有一个pandas数据框,其中一列的日期值为字符串(例如" 2014-01-01")。我想为列中存在的每年定义一个不同的列表,其中列表的元素是在数据框中找到年份的行的索引。

以下是我尝试的内容:

import pandas as pd    

df = pd.DataFrame(["2014-01-01","2013-01-01","2014-02-02", "2012-08-09"])
df = df.values.flatten().tolist()

for i in range(len(df)):
    df[i] = df[i][0:4]

y2012 = []; y2013 = []; y2014 = []

for i in range(len(df)):
    if df[i] == "2012":
        y2012.append(i)
    elif df[i] == "2013":
        y2013.append(i)
    else:
        y2014.append(i)

print y2014 # [0, 2]
print y2013 # [1]
print y2012 # [3]

有谁知道更好的方法吗?这种方式工作正常,但我有很多年,所以我必须手动定义每个变量,然后通过for循环运行它,所以代码变得非常长。我试图在熊猫中使用groupby,但我似乎无法让它发挥作用。

非常感谢您的帮助!

3 个答案:

答案 0 :(得分:0)

扫描原始DataFrame值并解析年份。鉴于此,将索引添加到defaultdict中。也就是说,以下代码每年创建一个dict项。特定年份的值是在数据框中找到年份的行的列表。

defaultdict听起来很可怕,但它只是一本字典。在这种情况下,每个值都是一个列表。如果我们append为不存在的值,则会自动创建。方便!

from collections import defaultdict
import pandas as pd    

df = pd.DataFrame(["2014-01-01","2013-01-01","2014-02-02", "2012-08-09"])
# df = df.values.flatten().tolist()

dindex = defaultdict(list)
for index,dateval in enumerate(df.values):
    year = dateval[0].split('-')[0]
    dindex[year].append(index)

assert dindex == {'2014': [0, 2], '2013': [1], '2012': [3]}
print dindex

输出

defaultdict(<type 'list'>, {'2014': [0, 2], '2013': [1], '2012': [3]})

答案 1 :(得分:0)

对于这种事情,Pandas 很棒,所以不要急于将你的数据帧立即转回到列表中。

这里的诀窍在于.apply()方法和.groupby()方法。

  1. 获取包含ISO格式日期字符串的数据框
  2. 将包含日期字符串的列解析为datetime对象
  3. 使用datetime.year创建另一列年份 datetime列中项目的属性
  4. 按新年列
  5. 对数据框进行分组
  6. 迭代groupby对象并提取列
  7. 这里有一些代码供你玩和grok:

    import pandas
    import dateutil
    
    df = pd.DataFrame({'strings': ["2014-01-01","2013-01-01","2014-02-02", "2012-08-09"]})
    df['datetimes'] = df['strings'].apply(dateutil.parser.parse)
    df['year'] = df['datetimes'].apply(lambda x: x.year)
    grouped_data= df.groupby('year')
    
    lists_by_year = {}
    for year, data in grouped_data
        lists_by_year [year] = list(data['strings'])
    

    它为我们提供了一个列表字典,其中键是年份,内容是该年的字符串列表。

    print lists_by_year 
    
    {2012: ['2012-08-09'],
     2013: ['2013-01-01'],
     2014: ['2014-01-01', '2014-02-02']}
    

答案 2 :(得分:0)

事实证明

df.groupby('A') #is just syntactical sugar for df.groupby(df['A'])

这意味着你要按年度分组所做的就是利用apply函数并重新编写语法

<强>解决方案

getYear = lambda x:x.split("-")[0]
yearGroups = df.groupby(df["dates"].apply(getYear))

<强>输出

for key,group in yearGroups: 
    print key

2012
2013
2014