私はこのQに役立つ答えを見つけ、同様に投稿します。
データフレームのリストを取得し、インデックス以外の列で共通の値を共有する行のみを持つ新しいdfを作成するにはどうすればよいですか?
基本的に交差点ですが、いくつかの理由で連結とマージは機能しません。
私は以下を見て、必要なものが得られませんでした:
2つのPandasデータフレームで共通の行(交差)を見つける
列ラベルに基づいてデータフレームの共通部分を取得するにはどうすればよいですか?
これが私が実装することになったものです。これをより効率的に行う他の方法があるかどうかを確認したいと思います。
import copy
dfs_array = [ df1, df2, df3, df4, ... ]
def intersection_of_dfs(dfs_array,col='Ticker'):
if len(dfs_array) <= 1:
# if we only have 1 or 0 elements simply return the origial array
# no error is given, logic must be created for the return value.
return dfs_array
# does a shallow copy only.
dfs = copy.copy(dfs_array)
length = len(dfs)
while length > 1:
df1 = dfs.pop()
df2 = dfs.pop()
df0 = df1.loc[ df1[col].isin( df2[col].values ) ]
dfs.insert(0,df0)
length = len(dfs)
return dfs
マージを使用するという提案は、インデックスと列の見出しを壊してしまうため、機能しません。
これはマージが与えるものです:
> [ open_x_x high_x_x low_x_x close_x_x volume_x_x Ticker ... LowAboveShort_y_y ShortAboveLong_y_y Return_y_y DayDiff_y_y
> AboveBelow_y_y ShortToLong_y_y
> 0 52.60 52.68 52.24 52.4779 7632 AADR ... 0.28214 1.087176 0.043298 2.600000 2.0 8.000000
> 1 14.03 14.03 14.03 14.0300 359 AAMC ... 0.17472 0.628733 0.202228 1.333333 7.0 2.600000
> 2 2.15 2.15 1.72 1.9500 10095 AAME ... -0.20068 0.107564 0.114286 1.000000 1.0 0.636364
>
> [3 rows x 61 columns]]
そして、これは以下のコードが与えるものです:
> [ open high low close volume Ticker Difference LongMA ShortMA HighBelowShort LowAboveShort
> ShortAboveLong Return DayDiff AboveBelow ShortToLong
> timestamp
> 2019-12-12 52.60 52.68 52.24 52.4779 7632 AADR 0.1379 50.870684 51.95786 0.72214 0.28214 1.087176 0.043298 2.600000 2.0 8.000000
> 2019-12-12 14.03 14.03 14.03 14.0300 359 AAMC -0.0100 13.226547 13.85528 0.17472 0.17472 0.628733 0.202228 1.333333 7.0 2.600000
> 2019-12-12 2.15 2.15 1.72 1.9500 10095 AAME 0.1900 1.813116 1.92068 0.22932 -0.20068 0.107564 0.114286 1.000000 1.0 0.636364]
列見出しと同様にタイムスタンプがどのように維持されるかに注意してください。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加