在Python中使用Pandas清理数据

2024-05-19 16:10:51 发布

您现在位置:Python中文网/ 问答频道 /正文

进行了我第一次API调用,以获取其中的1行7列(这是按日期获取活动度量数据的唯一可用报告导出调用):

下面是第一行,所以是excel中的A1

{'other': False, 'total': {'impressions': 346821, 'taps': 12167, 'installs': 7535, 'newDownloads': 5364, 'redownloads': 2171, 'latOnInstalls': 1878, 'latOffInstalls': 5657, 'ttr': 0.0351, 'avgCPA': {'amount': '1.8', 'currency': 'GBP'}, 'avgCPT': {'amount': '1.1147', 'currency': 'GBP'}, 'localSpend': {'amount': '123.456', 'currency': 'GBP'}, 'conversionRate': 0.6193}, 'metadata': {'campaignId': 219752776, 'campaignName': Campaign1', 'deleted': False}}

我想做的是删除每行中除localexpense:123.345之外的所有内容,然后对其进行汇总

我想我需要一些循环,但是,我不确定该怎么做,因为列名被归类为标题,我对熊猫很陌生

提前谢谢


Tags: 数据apifalse度量a1报告excelamount
2条回答

flixoflax的答案应该是可行的,而且是好的和直接的

不过,它在熊猫之外做了大量的工作;这里有一个纯熊猫解决方案作为示例(如果您最终决定要保留所有数据,还可以保留所有数据)

在pandas之外执行初始循环的问题是,虽然它对样本数据有效,但如果源数据在Excel中,则可以(并且应该)使用pandas加载数据。在这种情况下,将数据加载到pandas中,在pandas外部循环,然后返回到pandas中进行处理是没有意义的

按正常方式导入和加载数据:

import numpy as np
import pandas as pd

# Let's assume data is the result of the pandas Excel read
data = [
{
  'other': False,
  'total': {
    'impressions': 346821,
    'taps': 12167,
    'installs': 7535,
    'newDownloads': 5364,
    'redownloads': 2171,
    'latOnInstalls': 1878,
    'latOffInstalls': 5657,
    'ttr': 0.0351,
    'avgCPA': {
      'amount': '1.8',
      'currency': 'GBP'
    },
    'avgCPT': {
      'amount': '1.1147',
      'currency': 'GBP'
    },
    'localSpend': {
      'amount': '123.456',
      'currency': 'GBP'
    },
    'conversionRate': 0.6193
  },
  'metadata': {
    'campaignId': 219752776,
    'campaignName': 'Campaign1',
    'deleted ': False
  }
},
{
  'other': False,
  'total': {
    'impressions': 346821,
    'taps': 12167,
    'installs': 7535,
    'newDownloads': 5364,
    'redownloads': 2171,
    'latOnInstalls': 1878,
    'latOffInstalls': 5657,
    'ttr': 0.0351,
    'avgCPA': {
      'amount': '1.8',
      'currency': 'GBP'
    },
    'avgCPT': {
      'amount': '1.1147',
      'currency': 'GBP'
    },
    'localSpend': {
      'amount': '123.456',
      'currency': 'GBP'
    },
    'conversionRate': 0.6193
  },
  'metadata': {
    'campaignId': 219752776,
    'campaignName': 'Campaign1',
    'deleted ': False
  }
}
]

将数据直接加载到数据帧中(而不是循环并挑选一个键值)。注意,这会导致使用更多内存的数据帧,但这意味着所有值都可用,并且在外部不需要初始循环

此外,在第一次加载时,一些列将是字典。这需要清理一下

必要的操作可以一步一步或一次完成。在本例中,我将发布这两个集合以进行比较

# Step by step
# Create dataframe
df = pd.DataFrame(data)
# Split out the 'total' column
df2 = df['total'].apply(pd.Series)
# Split out the 'localSpend' column
df3 = df2['localSpend'].apply(pd.Series)
# Merge the three dataframes back together
result = pd.concat([df, df2, df3], axis=1)
print(f"Total result is:{result['amount'].astype('float64').sum()}")

或更简洁的形式,拆分和合并同时发生:

df = pd.DataFrame(data)
df = pd.concat([df, df['total'].apply(pd.Series)], axis=1)
df = pd.concat([df, df['localSpend'].apply(pd.Series)], axis=1)
print(f"Total result is:{df['amount'].astype('float64').sum()}")

并不是因为列被保留为默认的数据类型(对象),所以执行了df['amount'].astype('float64')。如果像flixoflax那样将列转换为数字,则不需要这样做

df['amount'] = pd.to_numeric(df["amount"], downcast="float")
print(f"Total result is:{df['amount'].sum():.3f}")

“金额”列的最终版本可以拆分为自己的数据帧或系列,同时可以转换为浮点:

df2["amount"] = pd.to_numeric(df["amount"], downcast="float")
print(f"Total result is:{df2['amount'].sum():.3f}")

我假设您的API响应是一个字典列表,如果我理解正确,您只需要将所有LocalExpense值相加:

代码如下:

import pandas as pd

data = [
{
  'other': False,
  'total': {
    'impressions': 346821,
    'taps': 12167,
    'installs': 7535,
    'newDownloads': 5364,
    'redownloads': 2171,
    'latOnInstalls': 1878,
    'latOffInstalls': 5657,
    'ttr': 0.0351,
    'avgCPA': {
      'amount': '1.8',
      'currency': 'GBP'
    },
    'avgCPT': {
      'amount': '1.1147',
      'currency': 'GBP'
    },
    'localSpend': {
      'amount': '123.456',
      'currency': 'GBP'
    },
    'conversionRate': 0.6193
  },
  'metadata': {
    'campaignId': 219752776,
    'campaignName': 'Campaign1',
    'deleted ': False
  }
},
{
  'other': False,
  'total': {
    'impressions': 346821,
    'taps': 12167,
    'installs': 7535,
    'newDownloads': 5364,
    'redownloads': 2171,
    'latOnInstalls': 1878,
    'latOffInstalls': 5657,
    'ttr': 0.0351,
    'avgCPA': {
      'amount': '1.8',
      'currency': 'GBP'
    },
    'avgCPT': {
      'amount': '1.1147',
      'currency': 'GBP'
    },
    'localSpend': {
      'amount': '123.456',
      'currency': 'GBP'
    },
    'conversionRate': 0.6193
  },
  'metadata': {
    'campaignId': 219752776,
    'campaignName': 'Campaign1',
    'deleted ': False
  }
}
]

# Creating empty list for just localSpend values
rows = list()

for row in data:
    rows.append(row['total']['localSpend'])

# loading list into dataframe
df = pd.DataFrame(rows)

# Converting column type to float
df['amount'] = pd.to_numeric(df["amount"], downcast="float")

# Summing the whole column
print("Total result is:", df['amount'].sum())

相关问题 更多 >