2017-05-30 10 views
1

私は電話番号を持つ列を1つ(文字列として)持っています。次に、既存の電話番号に追加したいゼロの量(int)を与える別の列があります。私がしたいことは、(5 * "0" => "00000")のようなものです。もう1つの前提条件があります。電話番号が「1」で終わる場合にのみ、ゼロを追加する必要があります。別の列に設定された金額に基づいて、パンダ列にゼロを追加します。

Example: 
>>> df = pd.DataFrame([["11", 2], ["21", 3], ["10", 6]], columns=['phone', 'ext_length']) 

What I tried: 
>>> df.loc[(df.phone.str.endswith("1")), "complete_phone"] = df.phone + (df.ext_length * "0") 

電話が「1」で終わる正しい行をフィルタリングし、コラム「complete_phoneは」作品作成中に、私は仕事に「数学」を取得することはできません。私は得ています

TypeError: ufunc 'multiply' did not contain a loop with signature matching types dtype('<U21') dtype('<U21') dtype('<U21') 

私はエラーメッセージを理解していませんか、これを解決する方法もありません。

PS:私は[in:]と[out:]との結果に加えて他の質問でも見ることができるように、Pythonの例を適切に含める方法を示すリンクも探していました。何かヒント?

答えて

1

私はあなたがmaskが必要だと思うのための条件のTruestr.repeat場合は交換:あなたのソリューションだけNaNを取得似て

mask = df.phone.str.endswith("1") 
df["complete_phone"] = df['phone'].mask(mask, df.apply(lambda x: x['phone'] + 
                   '0' * x.ext_length, axis=1)) 
print (df) 
    phone ext_length complete_phone 
0 11   2   1100 
1 21   3   21000 
2 10   6    10 
mask = df.phone.str.endswith("1") 
df["complete_phone"] = df.phone.mask(mask, df['phone'] + 
              df['ext_length'].apply(lambda x:'0'*x)) 
print (df) 
    phone ext_length complete_phone 
0 11   2   1100 
1 21   3   21000 
2 10   6    10 

s = pd.Series(['0'], index=df.index) 
mask = df.phone.str.endswith("1") 
df["complete_phone"] = df.phone.mask(mask, df.phone + s.str.repeat(df.ext_length)) 
print (df) 
    phone ext_length complete_phone 
0 11   2   1100 
1 21   3   21000 
2 10   6    10 

DataFrame.applyのもう一つの解決策s if ma SKはFalseです:

mask = df.phone.str.endswith("1") 
df.loc[mask, "complete_phone"] = df['phone'] + df.apply(lambda x: '0' * x.ext_length, axis=1) 
    phone ext_length complete_phone 
0 11   2   1100 
1 21   3   21000 
2 10   6   NaN 
+0

が、これは多くのことを助け、ありがとうございます。私はまだあなたがしていたことを考え出しています。しかし、私は実際の問題にすぐにそれを適用することができます。私はstr.repeatアプローチを使用しています。 – SLglider

0
In [1]: import pandas as pd 

In [2]: df = pd.DataFrame([["11", 2], ["21", 3], ["10", 6]], columns=['phone', 'ext_length']) 

In [3]: df 
Out[3]: 
    phone ext_length 
0 11   2 
1 21   3 
2 10   6 

In [4]: df['complete_phone'] = [number+'0'*length if number.endswith('1') else number for number, length in zip(df.phone, df.ext_length)] 

In [5]: df 
Out[5]: 
    phone ext_length complete_phone 
0 11   2   1100 
1 21   3   21000 
2 10   6    10 
+0

興味深いアプローチですが、私はそれを完全に理解していません(まだ)。しかし、それは同じ文脈で別の問題で私を助けるかもしれません。 – SLglider

+0

In [4]: '@SLgliderのリスト内のアプローチは、2つのカラム(' phone'と 'ext_length')を圧縮して、最後に1があるかどうかを調べます。そうであれば、番号に希望する変更を行い、そうでない場合はそのままにします。これの結果を 'complete_phone'に入れて、これが助けてくれることを願っています! :) –

0

私はapply機能が便利になると思う:

df = pd.DataFrame([["11", 2], ["21", 3], ["10", 6]], columns=['phone', 'ext_length']) 
df['complete_phone'] = df.apply(lambda x: x['phone'] + "0" * x['ext_length'], axis=1) 
関連する問題