【问题标题】:How to add rows with calculations of specific columns in pandas如何在熊猫中添加具有特定列计算的行
【发布时间】:2018-08-28 16:55:24
【问题描述】:

我有一个 dtaframe,我想在它的末尾添加 2 行,这将指示在一个数字范围之间有多少个单元格。除了第一个和最后一个(我有一个包含很多列的大数据框)之外,我想对所有列执行此操作。 例如,我有以下小规模数据框:

    start position      A     b    rnd
0        149449305      4    99     88       
1         47630133      6    50     10   
2        128200594     12     7    600   
3         49423101    100    10      8

我想仅在 A 列和 B 列中计算一个数字介于 0-9 和 10-100 之间的次数,并将其添加到数据框的末尾,范围在'start position' 列的 and ,如下所示:

        start position      A     b    rnd
    0        149449305      4    99     88       
    1         47630133      6    50     10   
    2        128200594     12     7    600   
    3         49423101    100    10      8
    4              0-9      2     1 
    5           10-100      2     3       

我该怎么做(不指明列的名称,而不是它们的索引范围,因为我有一个包含许多列的更大数据框)?

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    IIUC,使用pd.cutvalue_counts 得到范围计数,然后我们使用append

    newdf=df.iloc[:,1:-1].apply(lambda x : pd.cut(x,[0,9,100],labels=['0-9','10-100']).value_counts())
    df.append(newdf.rename_axis('startposition',axis=0).reset_index())
    Out[216]: 
         A   b    rnd startposition
    0    4  99   88.0     149449305
    1    6  50   10.0      47630133
    2   12   7  600.0     128200594
    3  100  10    8.0      49423101
    0    2   3    NaN        10-100
    1    2   1    NaN           0-9
    df=df.append(newdf.rename_axis('startposition',axis=0).reset_index()).reindex(df.columns,axis=1)
    df
    Out[217]: 
      startposition    A   b    rnd
    0     149449305    4  99   88.0
    1      47630133    6  50   10.0
    2     128200594   12   7  600.0
    3      49423101  100  10    8.0
    0        10-100    2   3    NaN
    1           0-9    2   1    NaN
    

    【讨论】:

    • 是否也可以计算所有数字 >100 ?并且不仅在一个范围内?
    【解决方案2】:

    您可以将最后 2 行计算为单独的数据帧,然后将这 2 个数据帧连接起来:

    df1 = ...
    df2 = pd.DataFrame()
    df2['start position'] = ['0-9', '10-99']
    df2['A'] = [df1['A'][df1['A'] >= 0][df1['A'] <= 9].count(), df1['A'][df1['A'] >= 10][df1['A'] <= 100].count()]
    df2['B'] = [df1['B'][df1['B'] >= 0][df1['B'] <= 9].count(), df1['B'][df1['B'] >= 10][df1['B'] <= 100].count()]
    
    result_df = pd.concat([df1, df2])[['start position','A','B','rnd']].reset_index()
    

    【讨论】:

    • 这将是一个很好的解决方案,但我不想特别提及列的名称,因为在我的原始数据框中,我有很多列
    【解决方案3】:

    您只需在列表中记下您的间隔一次。

    intervals=[(0,9), (10,100)]
    outside = []
    for a,b in intervals:
        inside = []
        for col in df.columns[1:-1]:
            inside.append(df[col].between(a, b).sum())
        outside.append(inside)
    
    new = []
    for i, interval in enumerate(intervals):
        new.append(['-'.join(map(str,interval))] + outside[i] + [''])
    
    new_df = pd.concat([df, pd.DataFrame(new, columns=df.columns)], axis=0, ignore_index=True)
    
      start position    A   b   rnd
    0      149449305    4   99  88
    1       47630133    6   50  10
    2      128200594   12   7   600
    3       49423101  100   10  8
    4            0-9    2   1   
    5         10-100    2   3   
    

    它需要,

    5.14 ms ± 713 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
    

    【讨论】:

      猜你喜欢
      • 2022-01-06
      • 2020-10-31
      • 1970-01-01
      • 2022-01-16
      • 2019-02-12
      • 2021-02-23
      • 1970-01-01
      • 2023-01-10
      • 1970-01-01
      相关资源
      最近更新 更多