python - 熊猫首先从同一索引上的不同列收集非空值
问题描述
我查询了一个巨大的表,其中每列中的大多数行None
对于每个单行都是 null ()(每个id
行有多行id
)。我想把这些压扁,这样我就每排一排id
我将提供一个输入的模拟示例:
id var1 var2
0 1 None None
1 1 None x
2 2 None k
3 3 None None
4 1 None None
5 1 y NOT
6 3 p None
7 2 ss None
8 2 None None
这将是输出的模拟示例:
id var1 var2
0 1 y x
1 2 ss k
2 3 p None
请注意"NOT"
from var2
column 没有做到这一点,因为它是id==1
.
如果每个 id 只有一个值,则以下代码段有效:
df = df.set_index('id')
cs = [df[col].dropna() for col in df]
pd.concat(cs, axis=1)
但是如果有多个值(例如NOT
在示例中),则会引发错误。
有没有一种简单的方法来聚合每个列的第一个非空值id
?谢谢。
这是模拟示例 pandas 数据框,我将为真实数据框提供更多列和行:
df = pd.DataFrame([[1, None, None],[1, None, "x"],[2, None, "k"],[3,None, None], [1, None, None], [1, "y", "NOT"], [3, "p", None], [2, "ss", None], [2, None, None]])
解决方案
idColumnName = 'id' # Define id column name
def funcGroup(x): # Define grouping function
columns = [x for x in x.columns if x!=idColumnName] # Get columns that are not id column
dictValues = {} # Init a dictionary
for col_ in columns: # For each column ...
nonNullValues = x.loc[~x[col_].isnull(), col_] # Get non null values
firstNonNullValue = np.nan # Init result value as null
if nonNullValues.shape[0]>0: firstNonNullValue = nonNullValues.iloc[0] # If there are not null values return first
dictValues[col_] = firstNonNullValue # Fill the dictionary
return pd.Series(dictValues, columns) # Return a pandas Serie
df.groupby([idColumnName]).apply(funcGroup).reset_index() # Group by your id column and apply defined function
推荐阅读
- python - 存储数据库中的值添加检查元素是否添加到列表末尾
- reactjs - ReactJs 中的多个 CKEditor5(不同版本) - 以 'CKEditorError: ckeditor-duplicated-modules' 结尾
- replace - 用于检测字幕的 MS Word 正则表达式
- maven - 相同的工件使用相同依赖项的不同版本
- reactjs - 为什么我们不在 React 中的 render 方法前面使用 super
- java - 你能创建一个包,里面有进口吗?
- html - 具有 CSS Sprite 背景的响应式圆圈
- node.js - 为什么我们需要另一个模式来进行模式拼接?
- android - 我使用 fastlane 供应将 apk 上传到商店,但是在可用 apk 列表中找不到 apk
- forms - 将图像上传到firebase的任何解决方案?