步驟:
- 統計每一個列的標簽個數
- 去除或者填充某一列NaN值
- 遍歷某一列
- 分組統計
- 在DataFrame中插入行
- 在DataFrame中追加行
pandas讀取Json數據或csv數據
以一個json數據為例,只要json每一個object都一致就可以:
# 讀取json或csv
df_f = pd.read_json(ROOT + 'metadata_compiled.csv')
df_f = pd.read_csv(ROOT+'metadata_compiled.csv', header=0, index_col=0)
# 保存csv
new_df.to_csv("./newframe.csv", sep=',')
groupby+count統計、去除或填充NaN
import os
import numpy as np
import pandas as pd
from tqdm import tqdm
import soundfile
root_path = "F:/DATAS/***/***-main/"
metafilename = "metadata.json"df_f = pd.read_json(root_path + metafilename)
print(df_f.head(10))# 統計一些列的值的數目,用groupby+count
print("--> shape:", df_f.shape) # 1324 7
print(df_f.groupby("B")["filename"].count()) # sum to 1120
print(df_f.groupby("C")["filename"].count()) # sum to 674
print(df_f.groupby("D")["filename"].count()) # sum to 1324
print(df_f.groupby("E")["filename"].count()) # sum to 1324
print(df_f.groupby("F")["filename"].count()) # sum to 204# 填充A列的NaN
# df_f["A"] = df_f["A"].fillna(2)
# 去除B列的NaN
# df_f = df_f.dropna(subset=["B"])
遍歷DataFramem
pandas DataFrame的遍歷
有多種方法,介紹一種
用itertuples得到迭代體,用getattr獲取列值。
dura_list = []# for idx, row in tqdm(enumerate(df_f.iterrows()), total=len(df_f)):
for idx, row in tqdm(enumerate(df_f.itertuples()), total=len(df_f)):# print(idx, row)fname = root_path + "raw/" +getattr(row, "filename")try:samples, sample_rate = soundfile.read(fname, dtype='float32')except Exception as e:print(e)print(fname)duration = samples.shape[0] / float(sample_rate)dura_list.append(duration)
print(dura_list)
列表畫直方圖
統計所得列表的直方圖,參考菜鳥教程
import matplotlib.pyplot as plt
plt.hist(cnt, bins=30, color='skyblue', alpha=0.8)# 設置圖表屬性
plt.title('RUNOOB hist() Test')
plt.xlabel('Value')
plt.ylabel('Frequency')# 顯示圖表
plt.show()
也可以用seaborn庫的displot或countplot直接畫出更好看的圖。
插入數據
pandas DataFrame并沒有提供插入一行數據的方法,可能是因為會打亂索引吧,一種方法是,先插入一個索引,然后插入一行數據,然后重新設置索引:
# reference:https://blog.csdn.net/sunmingyang1987/article/details/105486710
def insert_addidx(df, row, idx):df = df.reindex(index=df.index.insert(idx, str(idx)))df.loc[str(idx)] = rowdf.reset_index(drop=True)return df
這里的df是DataFrame,row是df.iloc[[rownum], :]或者df.loc[index]所得的一行DataFrame,idx是int值表示行索引。
需注意獲取一行數據的方式是:df.iloc[[idx], :],而不是df.iloc[idx, :]。
追加數據
追加數據其實可以用:
df.append(row)的方式,但是會報warning,官方建議的方法是:
new_df = pd.concat([new_df, df.iloc[[idx], :]], axis=0)
需注意獲取一行數據的方式是:df.iloc[[idx], :],而不是df.iloc[idx, :],也意味著可以一次追加多個列。
。