2017-11-17 18 views
2

データフレームに2つの列を追加したいのですが、データフレームに50の行があるので、列1の値は1から50、列2の値51私はPythonで初心者ですと上記の機能は、私の要求を満たすために修正が必要ですが、そうすることができませんでし増分値を持つデータフレームに2つの列を追加したい

def insertId(new_df, str): 
    df.insertId(0, str, range(1, 1 + len(df))) 
    return df 

100にする必要があります。

答えて

0

最初numpy arrayを作成し、DataFrameコンストラクタに渡し:

a = np.arange(1, 101).reshape(2,-1).T 
df1 = pd.DataFrame(a, columns=['a','b']) 

print(df1.head()) 

    a b 
0 1 51 
1 2 52 
2 3 53 
3 4 54 
4 5 55 

最終は、元のデータフレームに追加します。insertとあなたの関数と

df = df.join(df1) 

ソリューションを - の位置を特定することも可能です列pos、次に列名colと最後の開始番号start

#some Dataframe 
a = np.arange(1, 101).reshape(2,-1).T 
df = pd.DataFrame(a, columns=['a','b']) 
print (df.head()) 
    a b 
0 1 51 
1 2 52 
2 3 53 
3 4 54 
4 5 55 

def insertId(new_df, pos, col, start): 
    new_df.insert(pos, col, range(start, len(new_df) + start)) 
    return new_df 

#insert new column called s to DataFrame df in position 0 and values starts in 50 
df = insertId(df, 0, 's', 50) 
df = insertId(df, 2, 'new', 14) 
print (df.head()) 

    s a new b 
0 50 1 14 51 
1 51 2 15 52 
2 52 3 16 53 
3 53 4 17 54 
4 54 5 18 55 
1
# Create sample data for initial dataframe. 
np.random.seed(0) 
df = pd.DataFrame(np.random.randn(5, 3), columns=list('ABC')) 
>>> df 
      A   B   C 
0 1.764052 0.400157 0.978738 
1 2.240893 1.867558 -0.977278 
2 0.950088 -0.151357 -0.103219 
3 0.410599 0.144044 1.454274 
4 0.761038 0.121675 0.443863 

# Add new columns in sequential order. 
n = len(df) 
new_cols = ['a', 'b'] # Desired names for new columns. 
new_col_count = len(new_cols) 
df2 = pd.DataFrame(
    np.arange(1, n * new_col_count + 1).reshape(n, new_col_count, order='F') 
    columns=new_cols, 
    index=df.index) 
>>> pd.concat([df, df2], axis=1) 
      A   B   C a b 
0 1.764052 0.400157 0.978738 1 6 
1 2.240893 1.867558 -0.977278 2 7 
2 0.950088 -0.151357 -0.103219 3 8 
3 0.410599 0.144044 1.454274 4 9 
4 0.761038 0.121675 0.443863 5 10 
0

私は我々が外加算を行うことにより、他の一般的な解決策を生み出すことができアレキサンダーのセットアップ

セットアップ

np.random.seed(0) 
df = pd.DataFrame(np.random.randn(5, 3), columns=list('ABC')) 
df 
      A   B   C 
0 1.764052 0.400157 0.978738 
1 2.240893 1.867558 -0.977278 
2 0.950088 -0.151357 -0.103219 
3 0.410599 0.144044 1.454274 
4 0.761038 0.121675 0.443863 

オプション1
@活用しましょうナンシーと下の例では、私がm = 5と指定した5つの追加の列を使用した例を示します。私はstringascii_lowercaseを使って余分の列のラベルをつかむ。

from string import ascii_lowercase as labels 
import pandas as pd 
impot numpy as np 

n = len(df) 
m = 5 

df.assign(**dict(zip(
    labels[:m], 
    np.add.outer(np.arange(m) * n, np.arange(n)) 
))) 

      A   B   C a b c d e 
0 1.764052 0.400157 0.978738 0 5 10 15 20 
1 2.240893 1.867558 -0.977278 1 6 11 16 21 
2 0.950088 -0.151357 -0.103219 2 7 12 17 22 
3 0.410599 0.144044 1.454274 3 8 13 18 23 
4 0.761038 0.121675 0.443863 4 9 14 19 24 

オプション2
私はpd.DataFrame.assignと解決策を示す傾向にあります。しかし、pd.DataFrame.joinで同じことを達成できた可能性もあります。この場合、私はまだNumpyの外側の追加を使用していますが、私はオプション1で行ったものの転置を使用して、新しいデータフレームを構築し、元のものと結合します。

n = len(df) 
m = 5 

df.join(pd.DataFrame(
    np.add.outer(np.arange(n), np.arange(m) * n), 
    df.index, list('abcde') 
)) 

      A   B   C a b c d e 
0 1.764052 0.400157 0.978738 0 5 10 15 20 
1 2.240893 1.867558 -0.977278 1 6 11 16 21 
2 0.950088 -0.151357 -0.103219 2 7 12 17 22 
3 0.410599 0.144044 1.454274 3 8 13 18 23 
4 0.761038 0.121675 0.443863 4 9 14 19 24 
関連する問題