『退屈なことはPythonにやらせよう』13章 Excelスプレッドシートの操作のらくがき帳📝
こんにちは。aliceです。
今日で8月も終わりですね。残暑とはいつまでが残暑なのでしょう?
今回は『退屈なことはPythonにやらせよう』13章 Excelスプレッドシートの操作のらくがき帳です。
退屈なことはPythonにやらせよう、ExcelのことはExcelにやっていただこうなので、まったくテンションがあがりませんでした。
ごめんなさい🙇
セルのフォントの設定とか、行の高さを変えるとか、セルの結合とか、空行を入れるとか…、やるなら実際のExcelのデータをみながらやりたいです。
と思ったらやる気がどんどんなくなって、「そういうこともやろうと思えばPythonでできるんだなー、ふむふむ」と眺める程度に終わりました。
いつか必要なときがきたら、やりたいと思います。
前回のらくがき帳📝
では、以下らくがきです。
13章 英語版🔤
GitHub💖
13.4 プロジェクト:スプレッドシートからデータを読み込む
Excelからデータを読み込んで操作します。
具体的には以下のとおりです。
Excelからデータを読み込む
各郡の人口調査標準地域の数を数える
各郡の人口の合計を求める
結果を表示する
アメリカの人口調査データを使うのであまりピンときませんでした。
そしてExcel操作を頑張れなかったので、pandasで遊びました🪂
こんなデータを集計します。
7万行くらいあるけど、内容がわからない。
書き出しました。
import pprint
import pandas as pd
def generate_country_data(df):
"""
国全体のデータを生成する
:param df: DataFrame Excelファイルのデータ
:return: dict 国全体のデータ
"""
country_data = {}
grouped = df.groupby(['State', 'County'])
for (state, county), group in grouped:
if state not in country_data:
country_data[state] = {}
if county not in country_data[state]:
country_data[state][county] = {
'pop': group['POP2010'].sum(),
'tracts': len(group) + 1 # tractsを+1する
}
return country_data
def write_result_to_file(data, filename):
"""
結果をファイルに書き込む
:param data: 結果のデータ
:param filename: ファイル名
:return:
"""
with open(filename, 'w') as result_file:
result_file.write('all_data = ' + pprint.pformat(data))
if __name__ == '__main__':
df = pd.read_excel('censuspopdata.xlsx', sheet_name='Population by Census Tract')
print(df.head())
country_data = generate_country_data(df)
print('結果を書き込み中...')
write_result_to_file(country_data, 'census2010.py')
print('完了')
13.6 プロジェクト:スプレッドシートを更新する
特定の種類の農産物をみつけて、その価格を更新します。
こんなデータがあります。
データを更新しました。
import pandas as pd
def read_produce_sales_data(file_path):
"""
Excelファイルからデータフレームとしてデータを読み込みます。
:param file_path: Excelファイルのパス
:return: データフレーム
"""
df = pd.read_excel(file_path, sheet_name='Sheet')
return df
def update_produce_costs(df, update_dict):
"""
データフレームの'COST PER POUND'列を更新します。
:param df: データフレーム
:param update_dict: 更新する辞書
:return: 更新されたデータフレーム
"""
df['COST PER POUND'] = df['PRODUCE'].map(update_dict).fillna(df['COST PER POUND'])
return df
if __name__ == '__main__':
excel_file_path = 'produceSales.xlsx'
update_dict = {'Potatoes': 3.00, 'Garlic': 3.07, 'Celery': 1.19, 'Lemon': 1.27}
df = read_produce_sales_data(excel_file_path)
df_updated = update_produce_costs(df, update_dict)
print(df_updated.head())
13.14.1 掛け算の表を作る
N×Nの掛け算の表をExcelに出力するプログラムを作りましょう。
掛け算なので9×9にしてみました。
インデックスの出力に悩みました。
import pandas as pd
def create_multiplication_table(num):
"""
九九の表を作成する
:param num: 作成する表のサイズ
:return: 九九の表
"""
multiplication_table = [[i * j for j in range(1, num + 1)] for i in range(1, num + 1)]
return multiplication_table
def write_multiplication_table_to_excel(multiplication_table):
"""
九九の表をExcelファイルに書き込む
:param multiplication_table:九九の表
:return:
"""
df = pd.DataFrame(multiplication_table, index=range(1, len(multiplication_table) + 1),
columns=range(1, len(multiplication_table) + 1))
df.to_excel('multiplication_table.xlsx', index=True, header=True)
if __name__ == '__main__':
num = 9
multiplication_table = create_multiplication_table(num)
write_multiplication_table_to_excel(multiplication_table)
print('完了')
13.14.3 行と列の入れ替え
Excelのセルの行と列を入れ替えるプログラムを書きましょう。
【before】
【after】
CSVに書き出せば良かったかな?
import pandas as pd
def read_excel_file(file_path):
"""
Excelファイルからデータフレームとしてデータを読み込みます。
:param file_path: Excelファイルのパス
:return: データフレーム
"""
df = pd.read_excel(file_path, sheet_name='Sheet1')
return df
def transpose_data(df):
"""
データフレームのデータを転置します。
:param df: データフレーム
:return: 転置されたデータフレーム
"""
transposed_df = df.transpose() # 転置したデータフレームを新しい変数に割り当てる
return transposed_df
def write_excel_file(df, file_path):
"""
データフレームをExcelファイルに書き込みます。
:param df: データフレーム
:param file_path: Excelファイルのパス
:return:
"""
df.to_excel(file_path, index=True, header=False)
if __name__ == '__main__':
excel_file_path = 'base.xlsx'
df = read_excel_file(excel_file_path)
transposed_df = transpose_data(df) # 転置したデータフレームを新しい変数に割り当てる
write_excel_file(transposed_df, 'transpose.xlsx')
print('完了')
次は、Googleスプレッドシートなので、GASにできることはGASにやっていただこうとか言ってるな。
暑いからしかたないですねー。
つづき
この記事が気に入ったらサポートをしてみませんか?