删除重复的观察值和更多缺失值

时间:2019-01-28 16:55:43

标签: python pandas

我在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     .    .    .

在此示例中,我只保留第一个观察值和第六个观察值。

谢谢

3 个答案:

答案 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。