簡體   English   中英

將新的dataFrame列添加到pandas中的相同數據框

[英]Adding new dataFrame column to the same dataframe in pandas

問題:收到SettingWithCopy警告。

試圖在DataFrame的切片副本上設置一個值。 嘗試改用.loc [row_indexer,col_indexer] = value

目標:將列數據分成單獨的列,所有列都在同一DataFrame中。

輸入:具有2列的數據框。 第一列是電子郵件地址,第二列包含以分號分隔的日期列表。

碼:

for dt in lunch_dates:
    roulette_data[dt] = roulette_data['date'].str.contains(dt).map(bool_conversion)

我想要此代碼執行的操作(並且確實如此):為原始日期列中的每個找到的日期(dt)添加一個新列。

問題:在這種情況下如何使用iloc,以確保我不在內存中的數據幀的可能副本上工作?

你的例子

沒有數據可以對其進行測試,我將無法對其進行測試,但是以下方法應該可以工作(將“ email_column_name”替換為email列的名稱):

dates = pd.get_dummies(
                       roulette_data.set_index('email_column_name')['date']\
                       .str.split(';',expand=True)\
                       .stack().reset_index(level=1, drop=True)
                      )\
                      .reset_index().groupby('email_column_name').sum()

這是一個玩具示例:

df = pd.DataFrame({'col1':['record1', 'record2'], 
                  'col2':["this is good text", "but this is even better"]}
                 )

df
#      col1                     col2
#0  record1        this is good text
#1  record2  but this is even better

我們首先將索引設置為col1 ,然后選擇col2 ,因此可以使用其.str.split方法將行拆分為單個單詞。

df.set_index('col1')['col2'].str.split(expand=True)
#            0     1     2     3       4
#col1                                   
#record1  this    is  good  text    None
#record2   but  this    is  even  better

然后我們使用stack來更改形狀,並使用reset_index擺脫不必要的索引級別

df.set_index('col1')['col2'].str.split(expand=True)\
            .stack().reset_index(level=1, drop=True) 
#col1
#record1      this
#record1        is
#record1      good
#record1      text
#record2       but
#record2      this
#record2        is
#record2      even
#record2    better
#dtype: object

我們將整個表達式包裝在pd.get_dummies()中

pd.get_dummies(df.set_index('col1')['col2'].str.split(expand=True).stack().reset_index(level=1, drop=True))

#         better  but  even  good  is  text  this
#col1                                            
#record1       0    0     0     0   0     0     1
#record1       0    0     0     0   1     0     0
#record1       0    0     0     1   0     0     0
#record1       0    0     0     0   0     1     0
#record2       0    1     0     0   0     0     0
#record2       0    0     0     0   0     0     1
#record2       0    0     0     0   1     0     0
#record2       0    0     1     0   0     0     0
#record2       1    0     0     0   0     0     0

最終結果

最后,我們reset_index (這是col1或在您的情況下,電子郵件列), groupbycol1在它和總和。

pd.get_dummies(
               df.set_index('col1')['col2']\
               .str.split(expand=True)\
               .stack().reset_index(level=1, drop=True)
              )\
              .reset_index().groupby('col1').sum()
#         better  but  even  good  is  text  this
#col1                                            
#record1       0    0     0     1   1     1     1
#record2       1    1     1     0   1     0     1

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM