【问题标题】:How to create a new column of dictionaries based on groupby, pandas DataFrame?如何基于 groupby、pandas DataFrame 创建新的字典列?
【发布时间】:2019-02-08 00:35:45
【问题描述】:

我在 Python3.x 中有以下 pandas DataFrame,有两列字符串。

import pandas as pd

dict1 = {'column1':['MXRBMVQDHF', 'LJNVTJOY', 'WHLAOECVQR'], 
         'column2':['DPBVNJYANX', 'UWRAWDOB', 'CUTQVWHRIJ'], 'start':[79, 31, 52]}

df1 = pd.DataFrame(dict1)
print(df1)

#       column1     column2  start
# 0  MXRBMVQDHF  DPBVNJYANX     79
# 1    LJNVTJOY    UWRAWDOB     31
# 2  WHLAOECVQR  CUTQVWHRIJ     52

每一行都包含相同长度的字符串。这些字符串以特定方式索引,我正在编写一个用于在坐标之间进行翻译的字典。 column1 列中的字符串从 0 开始(如预期的那样)。 start 列中的整数表示column2 中字符串的“起始索引”。第一行,起始索引为 79。

目标是根据索引创建字典。因此,对于第一行,column1 中的字符串从 0 开始,column2 中的字符串从 79 开始。字典“转换”这些坐标如下:

{0: 79, 1: 80, 2: 81, 3: 82, 4: 83, 5: 84, 6: 85, 7: 86, 8: 87, 9: 88}

我的目标是使用这些字典在 pandas 数据框中创建一个新列。这很容易做到(尽管我怀疑.apply() 有更快的方法。):

for index, row in df1.iterrows():
     df1.loc[index,'new'] = [{i: i + row['start'] for i, e in enumerate(row['column1'])}]

现在df1 中有一个名为new 的列:

df1.new
0    {0: 79, 1: 80, 2: 81, 3: 82, 4: 83, 5: 84, 6: ...
1    {0: 31, 1: 32, 2: 33, 3: 34, 4: 35, 5: 36, 6: ...
2    {0: 52, 1: 53, 2: 54, 3: 55, 4: 56, 5: 57, 6: ...
Name: new, dtype: object

我的问题是:假设在column1 列中有多个相同字符串的条目。这是一个例子:

import pandas as pd

dict2 = {'column1':['MXRBMVQDHF', 'LJNVTJOY', 'LJNVTJOY', 'LJNVTJOY', 'WHLAOECVQR'], 'column2':['DPBVNJYANX', 'UWRAWDOB', 'PEKUYUQR', 'WPMLFVFZ', 'CUTQVWHRIJ'], 'start':[79, 31, 52, 84, 18]}

df2 = pd.DataFrame(dict2)
print(df2)
#       column1     column2  start
# 0  MXRBMVQDHF  DPBVNJYANX     79
# 1    LJNVTJOY    UWRAWDOB     31
# 2    LJNVTJOY    PEKUYUQR     52
# 3    LJNVTJOY    WPMLFVFZ     84
# 4  WHLAOECVQR  CUTQVWHRIJ     18

在这种情况下,LJNVTJOY 的坐标字典应该是:

{0: [31, 52, 84], 1: [32, 53, 85], 2: [33, 54, 86], 3: [34, 55, 87], 
     4: [35, 56, 88], 5: [36, 57, 89], 6: [37, 58, 90], 7: [38, 59, 91]}

这是一个基于列表的字典

{0: 31, 1: 32, 2: 33, 3: 34, 4: 35, 5: 36, 6: 37, 7: 38}
{0: 52, 1: 53, 2: 54, 3: 55, 4: 56, 5: 57, 6: 58, 7: 59}
{0: 84, 1: 85, 2: 86, 3: 87, 4: 88, 5: 89, 6: 90, 7: 91}

编辑:这是正确的输出。有一个带有 'new' 列的 DataFrame,如下所示:

df2.new
0    {0: 79, 1: 80, 2: 81, 3: 82, 4: 83, 5: 84, 6: ...
1    {0: [31, 52, 84], 1: [32, 53, 85], 2: [33, 54, 86], 3: [34, 55, 87], 4: [35, 56, 88], 5: [36, 57, 89], 6: [37, 58, 90], 7: [38, 59, 91]}
2    {0: 52, 1: 53, 2: 54, 3: 55, 4: 56, 5: 57, 6: ...
Name: new, dtype: object

【问题讨论】:

标签: python pandas dictionary dataframe pandas-groupby


【解决方案1】:

你可以使用cumcount创建dict键

df2['dictkey']=df2.groupby('column1').cumcount()
df2.groupby('column1').apply(lambda x : dict(zip(x['dictkey'],x['start'])))
Out[94]: 
column1
LJNVTJOY      {0: 31, 1: 52, 2: 84}
MXRBMVQDHF                  {0: 79}
WHLAOECVQR                  {0: 18}
dtype: object

【讨论】:

  • 您好文,感谢您的输出。我想我上面不清楚预期的输出应该是什么。请让我知道编辑是否有意义。谢谢!
  • @ShanZhengYang 我不能用你的输入匹配你的输出。
  • 我纠正了错字。这有意义吗?请对比df1.newdf2.new
猜你喜欢
  • 1970-01-01
  • 2021-12-30
  • 1970-01-01
  • 2016-02-10
  • 2019-04-10
  • 1970-01-01
  • 2019-02-10
  • 2022-12-01
  • 2018-02-28
相关资源
最近更新 更多