【Pandas】時系列のサンプルデータを作成する【Python】
MAX
MAX999blog
DataFrameをconcatで横に結合する場合、列名が重複していても自動でサフィックスが付加されることはない。
そのため、concat後に重複している列名をなんとか対応するか、concat前に予め対応するかが必要となる。
1df1 = pd.DataFrame(data={
2 "A": [1, 2, 3],
3 "B": [4, 5, 6],
4 "C": [7, 8, 9]
5})
6print(df1)
7# A B C
8# 0 1 4 7
9# 1 2 5 8
10# 2 3 6 9
11
12df2 = pd.DataFrame(data={
13 "A": [4, 5, 6],
14 "B": [5, 6, 7],
15 "C": [6, 7, 8]
16})
17print(df2)
18# A B C
19# 0 4 5 6
20# 1 5 6 7
21# 2 6 7 8
22
23df3 = pd.DataFrame(data={
24 "B": [1, 4, 7],
25 "C": [2, 5, 8],
26 "D": [3, 6, 9]
27})
28print(df3)
29# B C D
30# 0 1 2 3
31# 1 4 5 6
32# 2 7 8 9
df1とdf2は列名が完全に一致。df1とdf3はBとCが一致。
set()を使い、各DataFrameの列が集合として一致するかを判定する。
1print(set(df1.columns) == set(df2.columns))
2# True
3print(set(df1.columns) == set(df3.columns))
4# False
この処理の前提として各DataFrame内で列名は一意になっている必要がある。
DataFrame内での重複している列名の確認や重複している列の削除方法は以下の記事を参照。
1if set(df1.columns) == set(df2.columns):
2 # 2つのDataFrameの列名が一致する場合の処理
3 df_concat = pd.concat([df1, df2], axis=0)
4else:
5 # 2つのDataFrameの列名が一致しない場合の処理
6 raise ValueError("DataFrame columns not match.")
7
こんな感じでconcat前に列名が完全一致しているかチェックしたりするのに使える。
2つのDataFrameの列名の集合の積集合を取る。
1# 集合を使い、共通する列名を取得する
2common_columns = set(df1.columns) & set(df3.columns)
3# 集合なので、順序は保証されない。
4print(common_columns)
5# {"C", "B"}
結果も集合なので、要素の順序は元データの列の順序と一致するとは限らないことに注意。
2つのDataFrameの列名の集合の差集合を取る。
2つのDataFrameを入れ替えると差集合の内容は一致するとは限らないため注意が必要。
1# df1に存在する列の中で、df3に存在しない列を取得
2different_columns_df1_df3 = set(df1.columns) - set(df3.columns)
3print(different_columns_df1_df3)
4# {"A"}
5
6# df3に存在する列の中で、df1に存在しない列を取得
7different_columns_df3_df1 = set(df3.columns) - set(df1.columns)
8print(different_columns_df3_df1)
9# {"D"}
「-」の右側と左側で差集合の内容が変わってくることに注意。
2個のDataFrameの列名について
1# 2つのDataFrameの列名が一致するか確認
2print(set(df1.columns) == set(df2.columns))
3# True
4print(set(df1.columns) == set(df3.columns))
5# False
6
7# 2個のDataFrameの列名のうち、一致している列名を取得
8common_columns = set(df1.columns) & set(df3.columns)
9# 集合なので、順序は保証されない。
10print(common_columns)
11# {"C", "B"}
12
13# 2個のDataFrameの列名で一致していない列名を取得
14# df1に存在する列の中で、df3に存在しない列を取得
15different_columns_df1_df3 = set(df1.columns) - set(df3.columns)
16print(different_columns_df1_df3)
17# {"A"}
18
19# df3に存在する列の中で、df1に存在しない列を取得
20different_columns_df3_df1 = set(df3.columns) - set(df1.columns)
21print(different_columns_df3_df1)
22# {"D"}