【问题标题】:Pandas add empty rows as filler熊猫添加空行作为填充
【发布时间】:2015-12-20 04:04:21
【问题描述】:

给定以下数据框:

import pandas as pd
DF = pd.DataFrame({'COL1': ['A', 'A','B'], 
                   'COL2' : [1,2,1],
                   'COL3' : ['X','Y','X']})

DF

  COL1  COL2   COL3
0   A    1      X
1   A    2      Y
2   B    1      X

我想为 COL1 = 'B' 增加一行,这样两个值(COL1 A 和 B)都由 COL3 值 X 和 Y 表示,生成的行中的 COL2 为 0。

想要的结果如下:

  COL1  COL2   COL3
0   A    1      X
1   A    2      Y
2   B    1      X
3   B    0      Y

这只是一个简化的示例,但我需要一个可以处理许多此类实例的计算(而不仅仅是手动插入感兴趣的行)。

提前致谢!

更新:

对于在 'COL1' 和 'COL3' 下有许多不同的值组合的一般场景,这可行,但可能效率不高:

#Get unique set of COL3
COL3SET = set(DF['COL3'])
#Get unique set of COL1
COL1SET = set(DF['COL1'])
#Get all possible combinations of unique sets
import itertools
COMB=[]
for combination in itertools.product(COL1SET, COL3SET):
    COMB.append(combination)
#Create dataframe from new set:
UNQ = pd.DataFrame({'COMB':COMB})

#Split tuples into columns
new_col_list = ['COL1unq','COL3unq']
for n,col in enumerate(new_col_list):
    UNQ[col] = UNQ['COMB'].apply(lambda COMB: COMB[n])
UNQ = UNQ.drop('COMB',axis=1)

#Merge original data frame with unique set data frame
DF = pd.merge(DF,UNQ,left_on=['COL1','COL3'],right_on=['COL1unq','COL3unq'],how='outer')

#Fill in empty values of COL1 and COL3 where they did not have records
DF['COL1'] = DF['COL1unq']
DF['COL3'] = DF['COL3unq']

#Replace 'NaN's in column 2 with zeros
DF['COL2'].fillna(0, inplace=True)

#Get rid of COL1unq and COL3unq
DF.drop(['COL1unq','COL3unq'],axis=1, inplace=True)
DF

【问题讨论】:

  • 那么你是怎么得到COL3最下面一行的Y的呢?此外,COL1 是否仅包含 AB 值,或者还有其他值。鉴于您有很多这样的实例,您能否扩展您的示例以包含一个额外的案例。
  • 我希望解决方案能够检测到 COL1='B' 不存在现有的 COL3='Y',因此在将新行的 COL2 设置为 0 时添加该行。代码应获取 COL3 的唯一值集,检查 COL1 的所有唯一值是否都存在,如果不存在,则添加该行。没有比这更复杂的了,我只是想得到一个可以应用于多行的答案,而不是手动插入该特定行。

标签: python-3.x pandas dataframe


【解决方案1】:

这样的?

col1_b_vals = set(DF.loc[DF.COL1 == 'B', 'COL3'])
col1_not_b_col3_vals = set(DF.loc[DF.COL1 != 'B', 'COL3'])
missing_vals = col1_not_b_col3_vals.difference(col1_b_vals)
missing_rows = DF.loc[(DF.COL1 != 'B') & (DF.COL3.isin(missing_vals)), :]
missing_rows['COL1'] = 'B'
missing_rows['COL2'] = 0
>>> pd.concat([DF, missing_rows], ignore_index=True)
  COL1  COL2 COL3
0    A     1    X
1    A     2    Y
2    B     1    X
3    B     0    Y

【讨论】:

  • 这适用于样本数据,但是否可以对其进行调整以适用于缺少唯一 COL3 值集的任何值的任何 COL1 值?
  • 我认为修改后的答案可以满足您的要求。我使用套装来获得差异。
  • 我将其设置为正确答案,因为它适用于我提供的数据。我还将添加我为广义案例制定的内容。感谢您的帮助!
猜你喜欢
  • 2021-12-29
  • 1970-01-01
  • 1970-01-01
  • 2019-07-12
  • 2015-10-06
  • 2017-08-04
  • 2021-09-26
  • 2017-05-03
  • 1970-01-01
相关资源
最近更新 更多