首页 > 解决方案 > Python:如何根据一系列条件语句的结果将元素输出到特定列

问题描述

结合excel和pandas,我正在寻找一种可以区分特定行业编号并逐行复制相应列下的元素的解决方案。

IE:行业代码为58时,归档日期应复制到同一行第58列下。

在Overflow的帮助下,我能够创建公司代码是否以 000 结尾的第一个条件。

试图:

mask = df['Code'].str.endswith('000') == True
mask21 = df['Industry Code'].str.endswith('21') == True
mask57 = df['Industry Code'].str.endswith('57') == True
mask58 = df['Industry Code'].str.endswith('58') == True
mask59 = df['Industry Code'].str.endswith('59') == True
mask70 = df['Industry Code'].str.endswith('70') == True
mask71 = df['Industry Code'].str.endswith('71') == True
mask74 = df['Industry Code'].str.endswith('74') == True
mask75 = df['Industry Code'].str.endswith('75') == True
maskA008 = df['Industry Code'].str.endswith('A008') == True

df.loc[mask, ['c1','c2']] = df.loc[mask,['Code','Corporate Name']].to_numpy()
df.loc[~mask, ['c3','c4']] = df.loc[~mask, ['Code','Corporate Name']].to_numpy()

df.loc[mask21, ['c21']] = df.loc[~mask21, ['End Date']].to_numpy()
df.loc[mask57, ['c57']] = df.loc[~mask57, ['End Date']].to_numpy()
df.loc[mask58, ['c58']] = df.loc[~mask58, ['End Date']].to_numpy()
df.loc[mask59, ['c59']] = df.loc[~mask59, ['End Date']].to_numpy()
df.loc[mask70, ['c70']] = df.loc[~mask70, ['End Date']].to_numpy()
df.loc[mask71, ['c71']] = df.loc[~mask71, ['End Date']].to_numpy()
df.loc[mask74, ['c74']] = df.loc[~mas`enter code here`k74, ['End Date']].to_numpy()
df.loc[mask75, ['c75']] = df.loc[~mask75, ['End Date']].to_numpy()
df.loc[maskA008, ['A008']] = df.loc[~maskA008, ['End Date']].to_numpy()

错误代码:无法使用长度与值不同的多索引选择索引器进行设置


标签: pythonpandasdataframe

解决方案


您可以通过字典创建新列,其值用于匹配字典键中的字符串结尾和字典值中的新列名称:

df = pd.DataFrame({"Industry Code":['a0021','b400557','aa', 'aa009359'],
                   "End Date":['2015-01-01','2015-01-02','2015-01-03', '2015-01-04']})


ends = {'21':'c21','57':'c57','59':'c59','A008':'A008'}

for k, v in ends.items():
    mask = df['Industry Code'].str.endswith(k, na=False)
    df.loc[mask, v] = df.loc[mask, 'End Date']
    #if need append inverse mask
    #df.loc[mask, v] = df.loc[~mask, 'End Date']

print (df)
  Industry Code    End Date         c21         c57         c59 A008
0         a0021  2015-01-01  2015-01-01         NaN         NaN  NaN
1       b400557  2015-01-02         NaN  2015-01-02         NaN  NaN
2            aa  2015-01-03         NaN         NaN         NaN  NaN
3      aa009359  2015-01-04         NaN         NaN  2015-01-04  NaN

推荐阅读