簡體   English   中英

Pandas 中的數據操作:從列上的值創建一個布爾列,然后用另一列中的值填充

[英]Data manipulation in Pandas: create a boolean column from values on column then fill with value from yet another column

好的,我已經嘗試了太久了,是時候尋求幫助了。 我有一個看起來有點像這樣的數據框:

 person fruit quantity all_fruits 0 p1 grapes 2 [grapes, banana] 1 p1 banana 1 [grapes, banana] 2 p2 apple 4 [apple, banana, peach] 3 p2 banana 4 [apple, banana, peach] 4 p2 peach 2 [apple, banana, peach] 5 p3 grapes 1 [grapes] 6 p4 banana 1 [banana] 7 p5 apple 3 [apple, peach] 8 p5 peach 2 [apple, peach]

然后我有一個“感興趣的水果”列表:

Fruits_of_interest: ['蘋果', '香蕉']

我需要做的是:

  1. 為每個感興趣的水果創建一個列,並為第 1 列(人)上的每個人指定她是否有那個水果

  2. 對於第 1 列中的每個人,指定該人在該水果列下感興趣的水果數量的 log(1+x)

我正在努力完成這項工作! 我的實際數據框非常大,接近 80 萬行,並且“感興趣的水果”列表有 300 多個“水果”,這無濟於事。

對於第一部分,我使用了這個函數,並且可以獲取所有帶有布爾值的列,以顯示是否有水果:

 def has_fruit(fruit, row): one_string = '\\t'.join(row) return fruit in one_string
 def process_fruits(df, fruits_of_interest): for fruit in fruits_of_interest: df[fruit] = [has_fruit(fruit, x) for x in df['all_fruits']] return df

我需要分配值的第二部分是我根本無法工作的部分! 我已經嘗試使用另一個功能一次完成所有操作,但它並沒有完全完成它應該做的事情:

 def process_fruits2(df, fruits_of_interest): for fruit in fruits_of_interest: if [has_fruit(fruit, x) for x in df['all_fruits']]: df[fruit] = np.log1p(df.loc[df['fruit'] == fruit].quantity) return df

我做錯了什么,我怎么能做到這一點?

添加預期輸出:

這將是一個類似這樣的數據框(就像下面的答案,但只包含列表fruits_of_interest中的水果):

 person apple banana p1 0.000000 0.693147 p2 1.609438 1.609438 p3 0.000000 0.000000 p4 0.000000 0.693147 p5 1.386294 0.000000

這是一種方法。 我創建了一個包含人(行)與水果(列)的數據透視表:

from io import StringIO
import numpy as np
import pandas as pd

# create data frame
data = '''person  fruit   quantity
p1      grapes  2
p1      banana  1
p2      apple   4
p2      banana  4
p2      peach   2
p3      grapes  1
p4      banana  1
p5      apple   3
p5      peach   2
'''
df = pd.read_csv(StringIO(data), sep='\s+', engine='python')

計算數據透視表和日志 (1 + x):

# create summary table: person x fruit
df = df.pivot_table(index='person', columns='fruit', 
                    values='quantity', aggfunc=sum, fill_value=0)

# compute log(1 + fruit)
print(df, end='\n\n')
print(np.log(1 + df))

fruit   apple  banana  grapes  peach
person                              
p1          0       1       2      0
p2          4       4       0      2
p3          0       0       1      0
p4          0       1       0      0
p5          3       0       0      2

fruit      apple    banana    grapes     peach
person                                        
p1      0.000000  0.693147  1.098612  0.000000
p2      1.609438  1.609438  0.000000  1.098612
p3      0.000000  0.000000  0.693147  0.000000
p4      0.000000  0.693147  0.000000  0.000000
p5      1.386294  0.000000  0.000000  1.098612

暫無
暫無

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

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