The following comes close to what you want, essentially we create a list of values other than NaN, and then call to_json on this:
In [136]: df.apply(lambda x: [x.dropna()], axis=1).to_json() Out[136]: '{"0":[{"a":1.0,"b":4.0,"c":7.0}],"1":[{"b":5.0}],"2":[{"a":3.0}]}'
you need to create a list, otherwise it will try to align the result with your original df form, and this will return the NaN values that you want to avoid:
In [138]: df.apply(lambda x: pd.Series(x.dropna()), axis=1).to_json() Out[138]: '{"a":{"0":1.0,"1":null,"2":3.0},"b":{"0":4.0,"1":5.0,"2":null},"c":{"0":7.0,"1":null,"2":null}}'
also calling list on the result of dropna will translate the result using the form, for example, filling:
In [137]: df.apply(lambda x: list(x.dropna()), axis=1).to_json() Out[137]: '{"a":{"0":1.0,"1":5.0,"2":3.0},"b":{"0":4.0,"1":5.0,"2":3.0},"c":{"0":7.0,"1":5.0,"2":3.0}}'
Edchum
source share