Python 以大熊猫为单位,使用相应计数聚合值

Python 以大熊猫为单位,使用相应计数聚合值,python,pandas,dataframe,group-by,pandas-groupby,Python,Pandas,Dataframe,Group By,Pandas Groupby,我有一个数据框架,类似于: my_df = chr PI 2 5 2 5 2 5 2 6 2 6 2 8 2 8 2 8 2 8 2 8 3 5 3 5 3 5 3 5 3 9 3 9 3 9 3 9 3 9 3 9 3 9 3 7 3 7 3 4 ...... ...... new_df = p

我有一个数据框架,类似于:

my_df = 

chr   PI
2     5
2     5
2     5
2     6
2     6
2     8
2     8
2     8
2     8
2     8
3     5
3     5
3     5
3     5
3     9
3     9
3     9
3     9
3     9
3     9
3     9
3     7
3     7
3     4
......
......
new_df = pd.DataFrame({'chr': my_df['chr'].unique(),
         'unq_PI': my_df('chr')['unq_PI'].nunique()),
         'PIs': .......................,
         'PI_freq': ..................})

The only code that works is for `chr` when used alone; any additional code just throws an error. How can I fix this?
我想将其转换为包含数据帧新信息的新数据帧,如:

my_df = 

chr   PI
2     5
2     5
2     5
2     6
2     6
2     8
2     8
2     8
2     8
2     8
3     5
3     5
3     5
3     5
3     9
3     9
3     9
3     9
3     9
3     9
3     9
3     7
3     7
3     4
......
......
new_df = pd.DataFrame({'chr': my_df['chr'].unique(),
         'unq_PI': my_df('chr')['unq_PI'].nunique()),
         'PIs': .......................,
         'PI_freq': ..................})

The only code that works is for `chr` when used alone; any additional code just throws an error. How can I fix this?
独特染色体 unq_PI:每个染色体内唯一PI的数量 PIs:该染色体上PI值的列表 PI_freq:各染色体上每个PI的长度 因此,预期产出为:

我的想法是:

my_df = 

chr   PI
2     5
2     5
2     5
2     6
2     6
2     8
2     8
2     8
2     8
2     8
3     5
3     5
3     5
3     5
3     9
3     9
3     9
3     9
3     9
3     9
3     9
3     7
3     7
3     4
......
......
new_df = pd.DataFrame({'chr': my_df['chr'].unique(),
         'unq_PI': my_df('chr')['unq_PI'].nunique()),
         'PIs': .......................,
         'PI_freq': ..................})

The only code that works is for `chr` when used alone; any additional code just throws an error. How can I fix this?
您可以使用值_计数

您可以使用值_计数

使用groupby+value\u计数,后跟groupby+agg

这不考虑可使用groupby+nunique计算的唯一值的计数:

使用groupby+value\u计数,后跟groupby+agg

这不考虑可使用groupby+nunique计算的唯一值的计数:


如果订单很重要,请使用自定义功能:

def f(x):
    a = x.value_counts().astype(str).reindex(x.unique())
    i = ['unq_PI','PIs','PI_freq']
    return pd.Series([x.nunique(), ','.join(a.index), ','.join(a)], index=i)
df = df['PI'].astype(str).groupby(df['chr'], sort=False).apply(f).unstack().reset_index()
另一个解决方案:

df = (df.rename(columns={'PI' : 'PIs'})
        .groupby(['chr','PIs'], sort=False)
        .size()
        .rename('PI_freq')
        .reset_index(level=1)
        .astype(str)
        .groupby(level=0)
        .agg(','.join)
        .assign(unq_PI=lambda x: x['PIs'].str.count(',') + 1)
        .reset_index()
        .reindex(columns=['chr','unq_PI','PIs','PI_freq'])
       )
说明:

您可以通过这两列获取PI的唯一值及其每组的频率。然后,对于第二级多索引到列和转换到字符串:

df1 = (df.rename(columns={'PI' : 'PIs'})
        .groupby(['chr','PIs'], sort=False)
        .size()
        .rename('PI_freq')
        .reset_index(level=1)
        .astype(str)

       )
print (df1)
    PIs PI_freq
chr            
2     5       3
2     6       2
2     8       5
3     5       4
3     9       7
3     7       2
3     4       1
然后groupby index by level=0和aggreate join:

对于新列,对于最终列的自定义顺序,上次通过获取唯一值的数量:

df1 = (df.rename(columns={'PI' : 'PIs'})
        .groupby(['chr','PIs'], sort=False)
        .size()
        .rename('PI_freq')
        .reset_index(level=1)
        .astype(str)
        .groupby(level=0)
        .agg(','.join)
        .assign(unq_PI=lambda x: x['PIs'].str.count(',') + 1)
        .reset_index()
        .reindex(columns=['chr','unq_PI','PIs','PI_freq'])
       )

print (df1)
   chr  unq_PI      PIs  PI_freq
0    2       3    5,6,8    3,2,5
1    3       4  5,9,7,4  4,7,2,1

如果订单很重要,请使用自定义功能:

def f(x):
    a = x.value_counts().astype(str).reindex(x.unique())
    i = ['unq_PI','PIs','PI_freq']
    return pd.Series([x.nunique(), ','.join(a.index), ','.join(a)], index=i)
df = df['PI'].astype(str).groupby(df['chr'], sort=False).apply(f).unstack().reset_index()
另一个解决方案:

df = (df.rename(columns={'PI' : 'PIs'})
        .groupby(['chr','PIs'], sort=False)
        .size()
        .rename('PI_freq')
        .reset_index(level=1)
        .astype(str)
        .groupby(level=0)
        .agg(','.join)
        .assign(unq_PI=lambda x: x['PIs'].str.count(',') + 1)
        .reset_index()
        .reindex(columns=['chr','unq_PI','PIs','PI_freq'])
       )
说明:

您可以通过这两列获取PI的唯一值及其每组的频率。然后,对于第二级多索引到列和转换到字符串:

df1 = (df.rename(columns={'PI' : 'PIs'})
        .groupby(['chr','PIs'], sort=False)
        .size()
        .rename('PI_freq')
        .reset_index(level=1)
        .astype(str)

       )
print (df1)
    PIs PI_freq
chr            
2     5       3
2     6       2
2     8       5
3     5       4
3     9       7
3     7       2
3     4       1
然后groupby index by level=0和aggreate join:

对于新列,对于最终列的自定义顺序,上次通过获取唯一值的数量:

df1 = (df.rename(columns={'PI' : 'PIs'})
        .groupby(['chr','PIs'], sort=False)
        .size()
        .rename('PI_freq')
        .reset_index(level=1)
        .astype(str)
        .groupby(level=0)
        .agg(','.join)
        .assign(unq_PI=lambda x: x['PIs'].str.count(',') + 1)
        .reset_index()
        .reindex(columns=['chr','unq_PI','PIs','PI_freq'])
       )

print (df1)
   chr  unq_PI      PIs  PI_freq
0    2       3    5,6,8    3,2,5
1    3       4  5,9,7,4  4,7,2,1

如果你发布错误,这将是有益的。乍一看,似乎每个列都没有相同的唯一值。PIs和PI_freq值中的顺序重要吗?如果您发布错误,这会很有帮助。乍一看,似乎每个列都没有相同的唯一值。PIs和PI_freq值的顺序重要吗?