59713


もとのデータフレームから一列だけ抜き、更にdropnaしてその後処理を施し、もとのデータフレームにマージしようと試みています。  
マージキーになるようなものがデータにないため、indexを使ってマージしようと考えていますが、dropnaするとnanである部分のindexが歯抜けになるのではなく、上から0スタートで振り直されてしまいます。  
これを回避する方法はないでしょうか。

詳しい方、どうぞよろしくお願いいたします。


CC BY-SA 4.0
2019-09-14T07:51:34.060
59061
2019-10-15T05:58:18.757
12457
question
python python3 pandas
Pythonのpandasでindexでマージ


マージの方法は数種類あり、以下のように使い分けられます。

  1. **pd.merge(df1, df2, left_index=True, right_index=True)** : inner join
  2. **df1.join(df2)** : left join
  3. **pd.concat([df1, df2], axis=1)** : outer join

<https://stackoverflow.com/questions/40468069/merge-two-dataframes-by-index>

当然、outer joinを使えば、欠損値部分は再び欠損値になります。inner
joinを使えば、もとのデータに存在している行のうち、dropnaした側に存在しないindexの行は消えます。

そのため、現実的には「再びマージする」のような処理を加えるよりは、以下を実行したほうが良いです:

[code]

    df.dropna(subset=["欠損値を見る列名"])
    
[/code]

## サンプルの実行

[test.csv]

[code]

    c1,c2
    1,1
    2,
    3,5
    
[/code]

[ipythonでの実行]

> もとのデータフレームから一列だけ抜き、更にdropnaしてその後処理を施し、もとのデータフレームにマージしようと試みています。

これを以下で実行します。

[code]

    In [1]: import pandas as pd
    
    In [2]: df = pd.read_csv("test.csv")
    
    In [3]: df[["c2"]].dropna()
    Out[3]:
        c2
    0  1.0
    2  5.0
    
    In [4]: df2 = df[["c2"]].dropna()
    
    In [5]: df1 = df[["c1"]]
    
    In [6]: pd.merge(df1, df2, left_index=True, right_index=True)
    Out[6]:
       c1   c2
    0   1  1.0
    2   3  5.0
    
    In [7]: df1.join(df2)
    Out[7]:
       c1   c2
    0   1  1.0
    1   2  NaN
    2   3  5.0
    
    In [8]: df2.join(df1)
    Out[8]:
        c2  c1
    0  1.0   1
    2  5.0   3
    
    In [9]: pd.concat([df1,df2], axis=1)
    Out[9]:
       c1   c2
    0   1  1.0
    1   2  NaN
    2   3  5.0
    
    In[10]: df.dropna(subset=["c2"])
    Out[10]:
       c1   c2
    0   1  1.0
    2   3  5.0
    
    
    In [11]: df.dropna(subset=["c1"])
    Out[11]:
       c1   c2
    0   1  1.0
    1   2  NaN
    2   3  5.0
    
    
[/code]


CC BY-SA 4.0
2019-10-15T03:52:46.737
59713
2019-10-15T05:58:18.757
2019-10-15T05:58:18.757
59061
answer