我有一个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
,但我似乎无法让它发挥作用。
非常感谢您的帮助!
答案 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)
这里的诀窍在于.apply()
方法和.groupby()
方法。
这里有一些代码供你玩和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