我在df中有重复的值,但是其中一项发现有很多难点。 我想保留缺失值最低的重复值。
任何想法如何做到这一点?
这是我的df的示例:
id B C D
1 2 3 4
1 . 3 4
1 . . 4
2 9 7 .
2 9 . 8
2 9 7 8
2 . . .
在此示例中,我只保留第一个观察值和第六个观察值。
谢谢
答案 0 :(得分:3)
您可以使用df.isna().sum(axis=1)
来按行计算NaNs
的数量,然后使用GroupBy
id
并使用{{ 3}}:
NaNs
请确保缺失值是您指定的df.loc[df.isna().sum(axis=1).groupby(df.id).idxmin(),:]
id B C D
0 1 2.0 3.0 4.0
5 2 9.0 7.0 8.0
,否则以:p
NaNs
答案 1 :(得分:0)
您可以使用以下命令删除具有一定数量的NaN的任何行:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<appSettings>
<add key="autoFormsAuthentication" value="false" />
<add key="enableSimpleMembership" value="false" />
</appSettings>
<location path="." inheritInChildApplications="false" allowOverride="false">
<system.webServer>
<handlers>
<add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModule" resourceType="Unspecified" />
</handlers>
<aspNetCore processPath="dotnet" arguments=".\BusinessAdvisor.Inventory.dll" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" />
</system.webServer>
<system.web>
<trust level="Full" />
</system.web>
</location>
<system.web>
<authentication mode="None" />
<compilation defaultLanguage="c#" debug="true" />
</system.web>
<connectionStrings>
<add name="DefaultConnection" connectionString="server=localhost;user id=????_dba;password=???????;database=atechdzc_mobiserv;allowuservariables=True;persistsecurityinfo=True;SslMode=none" />
</connectionStrings>
</configuration>
<!--ProjectGuid: 5d471955-9737-4896-a960-3eb7ede4494e-->
df = df.dropna(axis=0, thresh=4) # drop any row that has at least 4 non-nans within it.
是行
axis=0
是支票。您可以将其设置为任何您喜欢的。您可以将其设置为2,这样将删除具有2个或更多NaN的任何行。
答案 2 :(得分:0)
一种超出您要求的功能的不同方法。这是如果某行中缺少某些值而另一行中缺少其他值,而您想将它们组合以获得更完整的信息:
const
array = [{ carA: 'Ford' }, { carA: 'Ford' }, { carB: 'GM' }, { carB: 'GM' }, { carA: 'Ford' }, { carA: 'Ford' }, { carB: 'GM' }, { carB: 'Ford' }]
carA = [].concat(...new Set(array.map(({ carA = [] }) => carA)));
console.log(carA);
请注意,示例df与您的问题稍有不同,因此可以证明这种方法在哪里更好。
对于ID 1,它与仅获取第一行相同。但是对于ID 2,它实际上能够填写所有值,您的(或其他答案)将只占一行,而所有行都很烂。
很明显,这假定非df = pd.DataFrame({"id": [1, 1, 1, 2, 2, 2], "B": [2, np.nan, np.nan, np.nan, np.nan, 9], "C": [3, 3, np.nan, 7, np.nan, np.nan], "D": [4, 4, 4, np.nan, 8, np.nan]})
# B C D id
# 0 NaN 3.0 4.0 1
# 1 NaN 3.0 NaN 1
# 2 NaN NaN 4.0 1
# 3 NaN 7.0 NaN 2
# 4 NaN NaN 8.0 2
# 5 9.0 NaN NaN 2
df.groupby("id", as_index=False).fillna(method="bfill").drop_duplicates(subset="id")
# B C D id
# 0 NaN 3.0 4.0 1
# 3 9.0 7.0 8.0 2
的值保持不变。如果不这样做,将仅采用该列中首次出现的NaN。