'20/08/15更新:インデックス番号を1から振り直すコードを追記。また、備忘録の観点から、本記事の構成を再編集しました。
1. ある列を対象に部分一致したその行データを抽出したい場合
df[df['列名'].str.contains('部分一致にしたい内容')]
完全一致の場合は下記のようにする
df[df['列名'] == '完全一致にしたい内容']
2. ある列のデータで並び替え(ソート)したい場合
df.sort_values(['列名'], ascending=True)
3. indexをリセットして、古いのは削除したい場合
df = df_sort.reset_index(drop=True)
4. インデックス番号を1から振り直したい場合
df.index = np.arange(1, len(df2) + 1)
5. pandasデータフレーム書式の列をリストへ変換したい場合
df['列名'].values.tolist()
本プログラムによるデータ処理の例を示します。下図のようなcsvファイルがあって、列名は任意で、各列のデータは数値でも文字列でも構いません。
No |
Property |
Material |
8 |
partA |
Fe |
9 |
partB |
Ag |
10 |
partC |
Al |
14 |
partD |
Cu |
15 |
partC |
Al |
16 |
partE |
Au |
1 |
partF |
Ag |
本コードを実行すると、次の①~⑤でデータ処理します。
① 列名「Material」の中から、「Ag」がある行データを全て抽出
② ①で抽出した行データから、列名「Property」にある「partFとpartB」をリストで抽出
③ 列名「No」でソートを掛けて、9→1から1→9の順番に変換。ここで、csvファイルにも保存します。
④ そのリストに文字列を挿入

⑤ 最後に、下図左の@MY_TARGET_?@と記載してる箇所を下図右のように置換します。

▼本プログラム
import os, sys
import shutil
import pandas as pd
import numpy as np
def extract_data(input_file, target_column_name, target_name,
sort_column_name, extract_column_name, sort_flag, i):
df = pd.read_csv(input_file, encoding = "utf-8")
print(df)
df_extract = df[df[target_column_name].str.contains(target_name)]
print(df_extract)
df_sort = df_extract.sort_values(sort_column_name, ascending=sort_flag)
print(df_sort)
df2 = df_sort.reset_index(drop=True)
df2.index = np.arange(1, len(df2) + 1)
print(df2)
df2.to_csv(str('{0:02d}'.format(i)) + '_' + target_name + '.csv', index=True)
extract_list = df2[extract_column_name].values.tolist()
print(extract_list)
return extract_list
def make_replace_list(extract_list):
buf_list = []
for i, data in enumerate(extract_list):
buf_list.append('abcdef_' + str(data))
print(buf_list)
return buf_list
def main():
for i, (target_name, target_string) in enumerate(zip(target_name_list, target_string_list)):
bacup_file_name = replace_file[:-4] + "_backup" + str(i) + '.txt'
shutil.copy2(replace_file, bacup_file_name)
extract_list = extract_data(input_file, target_column_name, target_name,
sort_column_name, extract_column_name, sort_flag, i)
replace_list = make_replace_list(extract_list)
replace_str = '\n'.join(replace_list)
with open(bacup_file_name, "r") as f2:
with open(replace_file, "w") as f1:
for row in f2:
if target_string in row:
f1.write(replace_str + '\n')
else:
f1.write(row)
if __name__ == '__main__':
input_file = './data.csv'
target_column_name = 'Material'
target_name_list = ['Ag', 'Al', 'Fe']
extract_column_name = 'No'
sort_column_name = 'No'
replace_file = './target.txt'
target_string_list = ['@MY_TARGET_1@', '@MY_TARGET_2@', '@MY_TARGET_3@']
sort_flag = True
main()
print('finished')
関連記事は下記です。
hk29.hatenablog.jp
以上
<広告>
リンク