【发布时间】: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是否仅包含A和B值,或者还有其他值。鉴于您有很多这样的实例,您能否扩展您的示例以包含一个额外的案例。 -
我希望解决方案能够检测到 COL1='B' 不存在现有的 COL3='Y',因此在将新行的 COL2 设置为 0 时添加该行。代码应获取 COL3 的唯一值集,检查 COL1 的所有唯一值是否都存在,如果不存在,则添加该行。没有比这更复杂的了,我只是想得到一个可以应用于多行的答案,而不是手动插入该特定行。
标签: python-3.x pandas dataframe