我需要从 pandas DataFrame 对象中创建一个 python 列表对象或任何对象,对来自不同行的值进行分组
Posted
技术标签:
【中文标题】我需要从 pandas DataFrame 对象中创建一个 python 列表对象或任何对象,对来自不同行的值进行分组【英文标题】:I need to create a python list object, or any object, out of a pandas DataFrame object grouping pieces of values from different rows 【发布时间】:2017-12-12 22:33:18 【问题描述】:我的 DataFrame 第一列有一个字符串,第二列有一个数字:
GEOSTRING IDactivity
9 wydm2p01uk0fd2z 2
10 wydm86pg6r3jyrg 2
11 wydm2p01uk0fd2z 2
12 wydm80xfxm9j22v 2
39 wydm9w92j538xze 4
40 wydm8km72gbyuvf 4
41 wydm86pg6r3jyrg 4
42 wydm8mzt874p1v5 4
43 wydm8mzmpz5gkt8 5
44 wydm86pg6r3jyrg 5
45 wydm8w1q8bjfpcj 5
46 wydm8w1q8bjfpcj 5
我想要做的是操作这个 DataFrame 以便拥有一个包含字符串的列表对象,该字符串由每个“GEOSTRING”值的第 5 个字符组成,用于每个不同的“IDactivity”值。 所以在这种情况下,我有 3 个不同的“IDactivity”值,我的列表对象中会有 3 个如下所示的字符串:
['2828', '9888','8888']
同样,您在每个字符串中看到的符号是每个“GEOSTRING”值的第 5 个值。
我要问的是一种解决方案或方法,它不涉及过于复杂的for
循环,并且尽可能高效,因为我必须处理大量数据。我希望它既干净又快速。
我希望它足够清楚。
【问题讨论】:
【参考方案1】:这可以通过以下方式轻松完成:(也被认为非常快)
result = df.groupby('IDactivity')['GEOSTRING'].apply(lambda x:''.join(x.str[4])).tolist()
这会按IDactivity
的值对数据框进行分组,然后从GEOSTRING
列的每个对应字符串中选择第5 个元素(索引4)并将其与其他对应字符串连接。最后我们添加tolist()
方法来获取输出为列表而不是熊猫系列。
输出:
['2828', '9888', '8888']
文档:
pandas.groupbypandas.apply
【讨论】:
【参考方案2】:这是一个涉及临时列的解决方案,并从this answer 获取关键操作的灵感:
# create a temp column with the character we want from each string
dframe['Temp'] = dframe['GEOSTRING'].apply(lambda x: x[4])
# groupby ID and then concatenate using a sneaky call to .sum()
dframe.groupby('IDactivity')['Temp'].sum().tolist()
结果:
['2828', '9888', '8888']
【讨论】:
这实际上很有用,因为我正在学习如何处理数据帧。 Rayhane 的回答可能更快,但你也很有帮助,谢谢以上是关于我需要从 pandas DataFrame 对象中创建一个 python 列表对象或任何对象,对来自不同行的值进行分组的主要内容,如果未能解决你的问题,请参考以下文章
pandas读取csv数据为dataframe计算dataframe中相连两行数据(记录)的时间差并将时间差从timedelta对象转化为整数
我需要从包含列表的字典中使用 MultiIndex 在 Pandas 中创建一个 DataFrame
如何将数据从 Scikit-learn Bunch 对象转换为 Pandas DataFrame?