[英]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.