簡體   English   中英

使用 Python 中的 Pandas 清理我的數據

[英]Cleaning up my data using Pandas in 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}}

id 喜歡做的是刪除每行中除 localSpend: 123.345 之外的所有內容,然后對其進行總結。

我假設我需要一些循環,但是,我不確定我是如何看待 go 的,因為列名被歸類為標題,而且我對 pandas 很陌生。

提前致謝!

我假設您的 API 響應是一個字典列表,如果我理解正確,您只想對所有 localSpend 值求和:

繼承人的代碼:

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())

flixoflax 的答案應該有效,而且簡單明了。

它在 pandas 之外做了很大一部分工作; 這是一個純 pandas 解決方案作為示例(如果您決定確實想要它,還有保留所有數據的額外好處)。

在 pandas 之外進行初始循環的問題在於,雖然它適用於示例數據,但如果源數據在 Excel 中,則 pandas 可以(並且 IMO 應該用於加載數據)。 在這種情況下,將數據加載到 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
  }
}
]

將數據直接加載到 dataframe 中(而不是循環並選擇一個鍵值)。 請注意,這會導致 dataframe 使用更多 memory 但這意味着所有值都可用,並且在 pandas 之外不需要初始循環。

此外,在第一次加載時,一些列將是字典。 這將需要清理。

必要的操作可以一步一步完成,也可以一次性完成。 為了這個例子,我將發布兩組進行比較。

# 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')已執行,因為該列已保留為默認 dtype(對象)。 如果您像 flixoflax 那樣將列轉換為數字,則不需要這樣做。

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

“金額”列的最終版本可以拆分為它自己的 dataframe 或系列,並且可以同時轉換為浮點數:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM