質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.61%

pandasで行を複製し縦に連結

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 6,224

score 24

いつも勉強させていただいてます。
AnacondaでPython2.7と3を使い分けています。
pandasのデータフレームで以下のようなものがあります。

In [45]: df_names.T
Out[45]: 
1      ./complex.2_P.pdb
2      ./complex.9_P.pdb
3      ./complex.7_P.pdb
4      ./complex.6_P.pdb
5      ./complex.5_P.pdb
6      ./complex.8_P.pdb
7      ./complex.4_P.pdb
8      ./complex.3_P.pdb
9       complex.10_P.pdb
10     complex.1-2_P.pdb
11       complex.2_P.pdb
12       complex.3_P.pdb
13       complex.4_P.pdb
14       complex.5_P.pdb
15       complex.6_P.pdb
16       complex.7_P.pdb
17     complex.7_P_P.pdb
18       complex.8_P.pdb
19       complex.9_P.pdb
20    complex.lig2_P.pdb
Name: 0, dtype: object


これを各行5個ずつに複製し、以下の様にカラム1に縦に連結していきたいと考えています。

0    ./complex.2_P.pdb
1    ./complex.2_P.pdb
2    ./complex.2_P.pdb
3    ./complex.2_P.pdb
4    ./complex.2_P.pdb
5    ./complex.9_P.pdb
6    ./complex.9_P.pdb
7    ./complex.9_P.pdb
8    ./complex.9_P.pdb
9    ./complex.9_P.pdb
10  ...
11  ...

そこでまず、行列を入れ替えて5行以上にしたものを作成し、カラム1~20までを5行ずつ取り出し、カラム1に縦積みしてこうとしたのですが、range指定した範囲の最後の2行しか出力されませんでした。(range(19)にすると最後の2行、range(3)では最初の2行といった形)
解決方法を教えてください。また、ほかに簡便な方法があればお願いします。

In [46]: df_names.T
Out[46]: 
                      1                  2         ...                       19                  20
0     ./complex.2_P.pdb  ./complex.9_P.pdb         ...          complex.9_P.pdb  complex.lig2_P.pdb
1     ./complex.2_P.pdb  ./complex.9_P.pdb         ...          complex.9_P.pdb  complex.lig2_P.pdb
2     ./complex.2_P.pdb  ./complex.9_P.pdb         ...          complex.9_P.pdb  complex.lig2_P.pdb
3     ./complex.2_P.pdb  ./complex.9_P.pdb         ...          complex.9_P.pdb  complex.lig2_P.pdb
4     ./complex.2_P.pdb  ./complex.9_P.pdb         ...          complex.9_P.pdb  complex.lig2_P.pdb
5     ./complex.2_P.pdb  ./complex.9_P.pdb         ...          complex.9_P.pdb  complex.lig2_P.pdb
6     ./complex.2_P.pdb  ./complex.9_P.pdb         ...          complex.9_P.pdb  complex.lig2_P.pdb
7     ./complex.2_P.pdb  ./complex.9_P.pdb         ...          complex.9_P.pdb  complex.lig2_P.pdb
8     ./complex.2_P.pdb  ./complex.9_P.pdb         ...          complex.9_P.pdb  complex.lig2_P.pdb
9     ./complex.2_P.pdb  ./complex.9_P.pdb         ...          complex.9_P.pdb  complex.lig2_P.pdb
10    ./complex.2_P.pdb  ./complex.9_P.pdb         ...          complex.9_P.pdb  complex.lig2_P.pdb


以下出力です。
(下書きだとcomplex.8とcomplex.9になっていますが、本文だと消えているように見えます。)

In [52]: for i in range(19):
    ...:     if i % 2 == 1:
    ...:         df_n=df_names
    ...:         df_n=df_n.iloc[1:6,i].append(df_n.iloc[1:6,i+1],ignore_index=True)
    ...:     else:
    ...:         continue
    ...: df_n
    ...: 
Out[52]: 
0    complex._P.pdb
1    complex._P.pdb
2    complex._P.pdb
3    complex._P.pdb
4    complex._P.pdb
5    complex._P.pdb
6    complex._P.pdb
7    complex._P.pdb
8    complex._P.pdb
9    complex._P.pdb
dtype: object

以下の様に実行できました。

In [58]: data_list
Out[58]: 
['./complex.2_P.pdb',
 './complex.9_P.pdb',
 './complex.7_P.pdb',
 './complex.6_P.pdb',
 './complex.5_P.pdb',
 './complex.8_P.pdb',
 './complex.4_P.pdb',
 './complex.3_P.pdb',
 'complex.10_P.pdb',
 'complex.1-2_P.pdb',
 'complex.2_P.pdb',
 'complex.3_P.pdb',
 'complex.4_P.pdb',
 'complex.5_P.pdb',
 'complex.6_P.pdb',
 'complex.7_P.pdb',
 'complex.7_P_P.pdb',
 'complex.8_P.pdb',
 'complex.9_P.pdb',
 'complex.lig2_P.pdb',
 './complex.9_P.pdb']

In [60]: ret=pd.concat([data]*5,1).stack().reset_index(drop=True)

In [61]: ret
Out[61]: 
0       ./complex.2_P.pdb
1       ./complex.2_P.pdb
2       ./complex.2_P.pdb
3       ./complex.2_P.pdb
4       ./complex.2_P.pdb
5       ./complex.9_P.pdb
6       ./complex.9_P.pdb
7       ./complex.9_P.pdb
8       ./complex.9_P.pdb
9       ./complex.9_P.pdb
10      ./complex.7_P.pdb
11      ./complex.7_P.pdb
12      ./complex.7_P.pdb
13      ./complex.7_P.pdb
14      ./complex.7_P.pdb
15      ./complex.6_P.pdb
16      ./complex.6_P.pdb
17      ./complex.6_P.pdb
18      ./complex.6_P.pdb
19      ./complex.6_P.pdb
20      ./complex.5_P.pdb
21      ./complex.5_P.pdb
22      ./complex.5_P.pdb
23      ./complex.5_P.pdb
24      ./complex.5_P.pdb
25      ./complex.8_P.pdb
26      ./complex.8_P.pdb
27      ./complex.8_P.pdb
28      ./complex.8_P.pdb
29      ./complex.8_P.pdb
              ...        
75        complex.7_P.pdb
76        complex.7_P.pdb
77        complex.7_P.pdb
78        complex.7_P.pdb
79        complex.7_P.pdb
80      complex.7_P_P.pdb
81      complex.7_P_P.pdb
82      complex.7_P_P.pdb
83      complex.7_P_P.pdb
84      complex.7_P_P.pdb
85        complex.8_P.pdb
86        complex.8_P.pdb
87        complex.8_P.pdb
88        complex.8_P.pdb
89        complex.8_P.pdb
90        complex.9_P.pdb
91        complex.9_P.pdb
92        complex.9_P.pdb
93        complex.9_P.pdb
94        complex.9_P.pdb
95     complex.lig2_P.pdb
96     complex.lig2_P.pdb
97     complex.lig2_P.pdb
98     complex.lig2_P.pdb
99     complex.lig2_P.pdb
100     ./complex.9_P.pdb
101     ./complex.9_P.pdb
102     ./complex.9_P.pdb
103     ./complex.9_P.pdb
104     ./complex.9_P.pdb
Length: 105, dtype: object

In [62]: ret=pd.concat([data]*5).sort_index().reset_index(drop=True)

In [63]: ret
Out[63]: 
0      ./complex.9_P.pdb
1      ./complex.9_P.pdb
2      ./complex.9_P.pdb
3      ./complex.9_P.pdb
4      ./complex.9_P.pdb
5      ./complex.2_P.pdb
6      ./complex.2_P.pdb
7      ./complex.2_P.pdb
8      ./complex.2_P.pdb
9      ./complex.2_P.pdb
10     complex.1-2_P.pdb
11     complex.1-2_P.pdb
12     complex.1-2_P.pdb
13     complex.1-2_P.pdb
14     complex.1-2_P.pdb
15       complex.2_P.pdb
16       complex.2_P.pdb
17       complex.2_P.pdb
18       complex.2_P.pdb
19       complex.2_P.pdb
20       complex.3_P.pdb
21       complex.3_P.pdb
22       complex.3_P.pdb
23       complex.3_P.pdb
24       complex.3_P.pdb
25       complex.4_P.pdb
26       complex.4_P.pdb
27       complex.4_P.pdb
28       complex.4_P.pdb
29       complex.4_P.pdb
             ...        
75     ./complex.6_P.pdb
76     ./complex.6_P.pdb
77     ./complex.6_P.pdb
78     ./complex.6_P.pdb
79     ./complex.6_P.pdb
80     ./complex.5_P.pdb
81     ./complex.5_P.pdb
82     ./complex.5_P.pdb
83     ./complex.5_P.pdb
84     ./complex.5_P.pdb
85     ./complex.8_P.pdb
86     ./complex.8_P.pdb
87     ./complex.8_P.pdb
88     ./complex.8_P.pdb
89     ./complex.8_P.pdb
90     ./complex.4_P.pdb
91     ./complex.4_P.pdb
92     ./complex.4_P.pdb
93     ./complex.4_P.pdb
94     ./complex.4_P.pdb
95     ./complex.3_P.pdb
96     ./complex.3_P.pdb
97     ./complex.3_P.pdb
98     ./complex.3_P.pdb
99     ./complex.3_P.pdb
100     complex.10_P.pdb
101     complex.10_P.pdb
102     complex.10_P.pdb
103     complex.10_P.pdb
104     complex.10_P.pdb
Name: 0, Length: 105, dtype: object
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

+1

単純に複製したいだけならappendを使用するのはいかがでしょうか?

import pandas as pd

df = pd.DataFrame([[1, 'A'],
                   [2, 'B'],
                   [3, 'C']], columns=['num', 'alp'])

print('実行前')
print(df)

df = df.append(df)  # 複製したい行数だけ繰り返す
df = df.sort_index()

print('実行後')
print(df)

出力は以下のようになるはずかと。

実行前
   num alp
0    1   A
1    2   B
2    3   C
実行後
   num alp
0    1   A
0    1   A
1    2   B
1    2   B
2    3   C
2    3   C

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/04/12 11:06

    自分もこちらの方法を推します(簡潔かつ2行で完了)が、補足としてappendやmergeについて参考になるこちらの記事を共有いたします。
    http://sinhrks.hatenablog.com/entry/2015/01/28/073327

    キャンセル

  • 2019/04/12 11:10

    ありがとうございます。DataFrameと複製数を色々と組み合わせて使いたかったのでmagichan様をベストアンサーにさせていただきました。実行前と実行後でPrintすると教科書的で分かりやすいですね。勉強になりました。

    キャンセル

  • 2019/04/12 11:13

    >omxin様
    入れ違いにコメントしてしまいました。情報提供ありがとうございます。図が分かりやすいですね。該当サイトを読んでいたのですが自分の応用力がありませんでした。

    キャンセル

checkベストアンサー

0

とりあえず2通りほど。

import pandas as pd

data = pd.Series(list('ABCDEFG'))

#横結合した後にstackする方法
ret = pd.concat([data] * 5, 1).stack().reset_index(drop=True)


#横結合した後にsortする方法
ret = pd.concat([data] * 5).sort_index().reset_index(drop=True)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/04/12 11:07

    ありがとうございます。リスト化して5倍するのが肝だったんですね。stackの方がリストの順番が保たれていたので、そちらを使おうと思います。順番が変わる違いについては今後勉強していこうと思います。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.61%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る