2017-05-17 1 views
-1

私は設定値

merged.loc[newsletters['Datum & Uhrzeit'], 'newsletters'] 

で特定の行を選択して、私はこれが何らかの理由でマージされた変更されませんnewsletters['Advertiser']

に対応する値にそれぞれの行を設定したいです。

merged.loc[newsletters['Datum & Uhrzeit'], 'newsletters'] = newsletters['Advertiser'] 

1つの列の特定の行を1つの値に設定するにはどうすればよいですか。

merged.head(5) 
Out[208]: 
      temp week_day commissions newsletters num_empfs 
date      
2017-01-12 6.0  Sun   64587  NaN NaN 
2017-01-13 11.0 Mon   12668  NaN NaN 
2017-01-18 11.0 Tue   11842  NaN NaN 
2016-02-03 8.0  Wed   85861  NaN NaN 
2016-02-04 5.0  Thu   4265   NaN NaN 

newsletters.head(5) 
Out[209]: 
Advertiser  Datum & Uhrzeit # Empfnger 
0 Vodafone 2017-01-12  48145 
1 DeinHandy 2017-01-13  4751 
2 Vodafone 2017-01-18  61234 

私はニュースレターに格納された値に列「ニュースレター」[「広告主」]の(ニュースレター[「データム& Uhrzeit」]に表示されます)特定の行を設定します。ニュースレター['Datum & Uhrzeit']のすべての値はマージされたインデックスにあります。

出力は次のようになります。

  temp week_day commissions newsletters num_empfs 
date      
2017-01-12 6.0  Sun   64587  Vodafone NaN 
2017-01-13 11.0 Mon   12668  DeinHandy NaN 
2017-01-18 11.0 Tue   11842  Vodafone NaN 
2016-02-03 8.0  Wed   85861  NaN NaN 
2016-02-04 5.0  Thu   4265   NaN NaN 
+0

'データム&Uhrzeitは、' どのような単一の列名または2つのdifferenct列です。サンプルdfとサンプル出力も提供できる方が良いでしょう。 –

+0

サンプルdfと希望の出力を投稿できますか?もっと簡単になります –

+0

何を求めているのか分かりにくいです。 – Allen

答えて

0
import numpy as np 
import pandas as pd 

# Define the data 
# ----------------------------------------------------------------------------- 
newsletters = pd.DataFrame({ 
    'Advertiser': ['Vodafone', 'DeinHandy', 'Vodafone'], 
    'Datum & Uhrzeit': ['2017-01-12', '2017-01-13', '2017-01-18'], 
    'Empfnger': [48145, 4751, 61234]}) 

merged = pd.DataFrame({ 
    'date': ['2017-01-12', '2017-01-13', '2017-01-18', 
      '2016-02-03', '2016-02-04'], 
    'temp': [6.0, 11.0, 11.0, 8.0, 5.0], 
    'week_day': ['Sun', 'Mon', 'Tue', 'Wed', 'Thu'], 
    'commissions': [64587, 12668, 11842, 85861, 4265], 
    'newsletters': [np.nan] * 5, 
    'num_empfs': [np.nan] * 5}) 

# Solution 
# ----------------------------------------------------------------------------- 
merged = merged.merge(
    # Rename 'Datum & Uhrzeit' to 'date' so that we can join the two 
    # DataFrames on common 'date' column. We could also join on different 
    # columns using left_on & right_on parameters of merge but it would 
    # result in two date columns in the merged df. 
    right=newsletters.rename(
     columns={'Datum & Uhrzeit': 'date'})[['date', 'Advertiser']], 
    on='date', how='left') 

if merged['newsletters'].isnull().all(): 
    # If the 'newsletters' column is full of NaNs we can just drop it 
    # and keep 'Advertiser' column instead: 
    merged = merged.drop('newsletters', axis=1).rename(columns={ 
     'Advertiser': 'newsletters'}) 
else: 
    # If there are not NaN values in 'newsletters' column, let's copy 
    # not NaN 'Advertiser' values into 'newsletters' and drop 'Advertiser': 
    merged.loc[merged['Advertiser'].notnull(), 'newsletters'] = merged.loc[ 
       merged['Advertiser'].notnull(), 'Advertiser'] 
    merged = merged.drop('Advertiser', axis=1) 

検証:print(merged)

commissions  date newsletters num_empfs temp week_day 
0  64587 2017-01-12 Vodafone  NaN 6.0  Sun 
1  12668 2017-01-13 DeinHandy  NaN 11.0  Mon 
2  11842 2017-01-18 Vodafone  NaN 11.0  Tue 
3  85861 2016-02-03   NaN  NaN 8.0  Wed 
4   4265 2016-02-04   NaN  NaN 5.0  Thu