【问题标题】:Appending dataframe total to new dataframe将数据帧总数附加到新数据帧
【发布时间】:2018-11-06 00:26:45
【问题描述】:

我正在使用 pandas 来计算文件名中“anystring”所在列的总和,并添加一个行“Totals_string”,其中包含对名为“any string”的请求的总和

df = pd.read_sql("select count(*) as requests,\
filename,\
file_extension,\
date_trunc('day', log_time) as date\
from "+dbase+"\
where\
filename like '%anyStringA%'\
OR\
filename like '%anyStringB%'\
OR\
filename like '%anyStringC%'\
and\
file_extension not in ('gif')\
group by filename,file_extension,date_trunc('day', log_time)\
order by requests desc",conn)

这会创建一个像这样的 df:

requests    filename    Extension   date
0   10  xxanyStringAxx  .jpg    2018-10-31
1   8   xxanyStringBxx  .jpg    2018-10-31
2   11  xxanyStringCxx  .jpg    2018-10-31
3   12  xxxanyStringAxx .jpg    2018-10-31
.

我想用每个条件的总数创建一个新的 DF,例如 数据框看起来像

Totals_anyStringA = 22
Totals_anyStringB = 8
Totals_anyStringC = 11

根据@sacul 的建议,我这样做了:

Totals_df = (df.groupby(df.url_info_filename.str.extract('anyName(.*)')\
                        .requests.sum()\
                        .add_prefix('Total_')\
                        .to_frame()))

我的错误是:

AttributeError: 'Series' object has no attribute 'requests'

*我也不知道如何为每个不同的名称创建一个新行,正如您所见,我只是在使用 anyStringA 进行测试,但它应该以某种方式包含所有感兴趣的名称。

谢谢

【问题讨论】:

  • 对于你的属性错误,只需大写Requests(因为你的列名是Requests而不是requests)
  • @sacul 固定示例.. 粘贴错误但错误仍然存​​在,当一切都在相同的情况下也更新示例
  • 试试df.url_info_filename.str.extract('anyString(.*)xx').requests...
  • @sacul 我用 ^ 示例相同的错误编辑了问题。 xx 只是代表文件名中的任何字符 ABC 只是用来区分不同名称的可能性,但它不是字面上的 A,BorC,抱歉不清楚。
  • 如果始终是 1 个字符,请使用 str.extract('anyString(\w)'),但如果没有明确的规则来说明您要提取的内容,我不确定还能提供什么

标签: python python-2.7 pandas dataframe


【解决方案1】:

IIUC,您想从文件名中提取Album 之后和下划线_ 之前的字符串,然后对其进行分组,得到总和,并将其放入新表中。如果是这样的话,你可以这样做(我添加了一些任意专辑来说明):

>>> df
   Requests    filename Extension        date
0    914208  AlbumA_100      .jpg  2018-10-31
1     73795  AlbumA_132      .jpg  2018-10-31
2     39651  AlbumA_130      .jpg  2018-10-31
3        10  AlbumB_130      .jpg  2018-10-31
4        15  AlbumB_135      .jpg  2018-10-31
4        85  AlbumC_135      .jpg  2018-10-31
4        15   AlbumC_13      .jpg  2018-10-31

totals_df = (df.groupby(df.filename.str.extract('Album(.*)_'))
             .Requests.sum()
             .add_prefix('Total_')
             .to_frame())

>>> totals_df
          Requests
filename          
Total_A    1027654
Total_B         25
Total_C        100

【讨论】:

  • 我使用“AlbumX”它实际上可以是任何东西,例如,如果文件名包含 cat 即 pictureofcatintree.jpg 我可能想要计算所有包含“cat”的文件名。所以我的总数可能是 cat = xxx , tree= xxx 等。我认为您的答案在我正在寻找的正确轨道上,除了我不熟悉的“提取”部分。
  • 我更新了我的示例,我只是停留在你的 totals_df 代码的一部分
猜你喜欢
  • 2023-04-10
  • 1970-01-01
  • 1970-01-01
  • 2020-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-28
相关资源
最近更新 更多