大佬教程收集整理的这篇文章主要介绍了根据pandas中另一列的值对列执行操作,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个数据框
df = pd.DataFrame([["A",1,98,88,"",567,453,545,656,323,756],["B",99,231,232,234,943,474,345],["C",97,67,23,543,458,456,876,935,876],79,84,895,237,678,452,453],["A",45,58,334,778,983,858,657],55,183,565,953,234]],columns=["ID","date","col1","col2","col3","col1_num","col1_deno","col3_num","col3_deno","col2_num","col2_deno"])
我需要为列名分别设置 _num 和 _deno 的 Nan/blank 值。例如:如果 "col1" 的特定行为空,则为 "col1_num" 和 "col1_deno" 设置值 Nan/blank。对基于 "col2" 和 "col3_num" 的 "col2_num" 和 "col2_deno" 重复相同的过程> 和 "col3_deno" 基于 "col3"。
预期输出:
df_out = pd.DataFrame([["A",""],"col2_deno"])
怎么做?
让我们尝试布尔掩蔽:
# select the columns
c = pd.Index(['col1','col2','col3'])
# create boolean mask
m = df[c].eq('').to_numpy()
# mask the values in `_num` and `_deno` like columns
df[c + '_num'] = df[c + '_num'].mask(m,'')
df[c + '_deno'] = df[c + '_deno'].mask(m,'')
>>> df
id date col1 col2 col3 col1_num col1_deno col3_num col3_deno col2_num col2_deno
0 A 1 98 88 567 453 323 756
1 B 1 99 231 232
2 C 1 97 67 23 543 458 456 876 935 876
3 B 1 79 84 678 452 545 453
4 A 1 45 58 334 778 234 983
5 C 1 23 55 183 565 234 234
,
@shubham 的回答简单明了,我相信也更快;这只是一个选项,您可能无法(或想要)列出所有列
获取需要更改的列列表:
cols = [col for col in df if col.startswith('col')]
['col1','col3','col1_num','col1_deno','col3_num','col3_deno','col2_num','col2_deno']
创建一个字典,将 col1 与要更改的列配对,对于 col2 等也是如此:
from collections import defaultdict
d = defaultdict(list)
for col in cols:
if "_" in col:
d[col.split("_")[0]].append(col)
d
defaultdict(list,{'col1': ['col1_num','col1_deno'],'col3': ['col3_num','col3_deno'],'col2': ['col2_num','col2_deno']})
遍历字典以分配新值:
for key,val in d.items():
df.loc[df[key].eq(""),val] = ""
id date col1 col2 col3 col1_num col1_deno col3_num col3_deno col2_num col2_deno
0 A 1 98 88 567 453 323 756
1 B 1 99 231 232
2 C 1 97 67 23 543 458 456 876 935 876
3 B 1 79 84 678 452 545 453
4 A 1 45 58 334 778 234 983
5 C 1 23 55 183 565 234 234
,
MultiIndex
的解决方案:
#first convert not processing and testing columns to index
df1 = df.set_index(['id','date'])
cols = df1.columns
#split columns by _ for MultiIndex
df1.columns = df1.columns.str.split('_',expand=True)
#compare columns without _ (with NaN in second level) by empty string
m = df1.xs(np.nan,axis=1,level=1).eq('')
#create mask by all columns
mask = m.reindex(df1.columns,level=0)
#set new values by mask,overwrite columns names
df1 = df1.mask(mask,'').set_axis(cols,axis=1).reset_index()
print (df1)
id date col1 col2 col3 col1_num col1_deno col3_num col3_deno col2_num \
0 A 1 98 88 567 453 323
1 B 1 99 231 232
2 C 1 97 67 23 543 458 456 876 935
3 B 1 79 84 678 452 545
4 A 1 45 58 334 778 234 983
5 C 1 23 55 183 565 234
col2_deno
0 756
1
2 876
3 453
4
5 234
以上是大佬教程为你收集整理的根据pandas中另一列的值对列执行操作全部内容,希望文章能够帮你解决根据pandas中另一列的值对列执行操作所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。