我想检查数据框中列的值是否等于0,如果它是0,我想替换该列的前一行的值。
假设我的数据如下,
X
683 24.48
684 24.48
685 24.48
686 24.48
687 24.48
688 24.48
689 25.02
690 25.02
691 25.02
692 25.02
693 25.02
694 25.02
695 25.02
696 25.02
697 25.32
698 25.32
699 25.32
700 0.00
701 0.00
702 0.00
703 0.00
704 0.00
705 0.00
706 0.00
707 0.00
708 0.00
709 0.00
710 0.00
711 0.00
712 0.00
713 0.00
714 0.00
715 0.00
716 0.00
717 0.00
718 0.00
719 0.00
720 0.00
721 0.00
722 0.00
723 0.00
724 0.00
725 0.00
726 0.00
727 0.00
728 0.00
729 0.00
730 0.00
731 0.00
732 0.00
733 0.00
734 0.00
735 0.00
736 0.00
737 0.00
738 0.00
739 0.00
740 0.00
741 0.00
742 0.00
743 0.00
744 0.00
745 0.00
746 0.00
747 0.00
748 0.00
749 0.00
750 0.00
751 0.00
752 0.00
753 0.00
754 0.00
755 0.00
756 0.00
757 0.00
758 0.00
759 0.00
760 0.00
761 0.00
762 0.00
763 0.00
764 0.00
765 0.00
766 0.00
767 0.00
768 0.00
769 0.00
770 0.00
771 0.00
772 0.00
773 0.00
774 0.00
775 0.00
776 0.00
777 0.00
778 0.00
779 0.00
780 0.00
781 0.00
782 0.00
783 0.00
784 0.00
785 0.00
786 0.00
787 0.00
788 0.00
789 0.00
790 0.00
791 0.00
792 0.00
793 0.00
794 0.00
795 0.00
796 0.00
797 0.00
798 0.00
799 0.00
800 0.00
801 0.00
802 0.00
803 0.00
804 0.00
805 0.00
806 0.00
807 0.00
808 0.00
809 0.00
810 0.00
811 0.00
812 0.00
813 0.00
814 0.00
815 0.00
816 0.00
817 0.00
818 0.00
819 0.00
820 0.00
821 0.00
822 0.00
823 0.00
824 0.00
825 0.00
826 0.00
827 0.00
828 0.00
829 0.00
830 0.00
831 0.00
832 0.00
833 0.00
834 0.00
835 0.00
836 0.00
837 0.00
838 0.00
839 0.00
840 0.00
841 0.00
842 0.00
843 0.00
844 0.00
845 0.00
846 0.00
847 0.00
848 0.00
849 0.00
850 0.00
851 0.00
852 0.00
853 0.00
854 0.00
855 0.00
856 0.00
857 0.00
858 0.00
859 0.00
860 0.00
861 0.00
862 0.00
863 0.00
864 0.00
865 0.00
866 0.00
867 0.00
868 0.00
869 0.00
870 0.00
871 0.00
872 0.00
873 0.00
874 0.00
875 0.00
876 0.00
877 0.00
878 0.00
879 0.00
880 0.00
881 0.00
882 0.00
883 0.00
884 0.00
885 0.00
886 0.00
887 0.00
888 0.00
889 0.00
890 0.00
891 0.00
892 0.00
893 0.00
894 0.00
895 0.00
896 0.00
897 0.00
898 0.00
899 0.00
900 0.00
901 0.00
902 0.00
903 0.00
904 0.00
905 0.00
906 0.00
907 0.00
908 0.00
909 0.00
910 0.00
911 0.00
912 0.00
913 0.00
914 0.00
915 0.00
916 0.00
917 0.00
918 0.00
919 0.00
920 0.00
921 0.00
922 0.00
923 0.00
924 0.00
925 0.00
926 0.00
927 0.00
928 0.00
929 0.00
930 0.00
931 0.00
932 0.00
933 0.00
934 0.00
935 0.00
936 0.00
937 0.00
938 0.00
939 0.00
940 0.00
941 0.00
942 0.00
943 0.00
944 0.00
945 0.00
946 0.00
947 0.00
948 0.00
949 0.00
950 0.00
951 0.00
952 0.00
953 0.00
954 0.00
955 0.00
956 0.00
957 0.00
958 0.00
959 0.00
960 0.00
961 0.00
962 0.00
963 0.00
964 0.00
965 0.00
966 0.00
967 0.00
968 0.00
969 0.00
970 0.00
971 0.00
972 0.00
973 0.00
974 0.00
975 0.00
976 0.00
977 0.00
978 0.00
979 0.00
980 0.00
981 0.00
982 0.00
983 0.00
984 0.00
985 0.00
986 0.00
987 0.00
988 0.00
989 0.00
990 0.00
991 0.00
992 0.00
993 0.00
994 0.00
995 0.00
996 0.00
997 0.00
998 0.00
999 0.00
1000 0.00
1001 0.00
1002 0.00
1003 0.00
1004 0.00
1005 0.00
1006 0.00
1007 0.00
1008 0.00
1009 0.00
1010 0.00
1011 0.00
1012 0.00
1013 0.00
1014 0.00
1015 0.00
1016 0.00
1017 0.00
1018 0.00
1019 0.00
1020 0.00
1021 0.00
1022 0.00
1023 0.00
1024 0.00
1025 0.00
1026 0.00
1027 0.00
1028 0.00
1029 0.00
1030 0.00
1031 0.00
1032 0.00
1033 0.00
1034 0.00
1035 0.00
1036 0.00
1037 0.00
1038 0.00
1039 0.00
1040 0.00
1041 0.00
1042 0.00
1043 0.00
1044 0.00
1045 0.00
1046 0.00
1047 0.00
1048 0.00
1049 0.00
1050 0.00
1051 0.00
1052 0.00
1053 0.00
1054 0.00
1055 0.00
1056 0.00
1057 0.00
1058 0.00
1059 0.00
1060 0.00
1061 0.00
1062 0.00
1063 0.00
1064 0.00
1065 0.00
1066 0.00
1067 0.00
1068 0.00
1069 0.00
1070 0.00
1071 0.00
1072 0.00
1073 0.00
1074 0.00
1075 0.00
1076 0.00
1077 0.00
1078 0.00
1079 0.00
1080 0.00
1081 0.00
1082 0.00
1083 0.00
1084 0.00
1085 0.00
1086 0.00
1087 0.00
1088 0.00
1089 0.00
1090 0.00
1091 0.00
1092 0.00
1093 0.00
1094 0.00
1095 0.00
1096 0.00
1097 0.00
1098 0.00
1099 0.00
1100 0.00
1101 0.00
1102 0.00
1103 0.00
1104 0.00
1105 0.00
1106 0.00
1107 0.00
1108 0.00
1109 0.00
1110 0.00
1111 0.00
1112 0.00
1113 0.00
1114 0.00
1115 0.00
1116 0.00
1117 0.00
1118 0.00
1119 0.00
1120 0.00
1121 0.00
1122 0.00
1123 0.00
1124 0.00
1125 0.00
1126 0.00
1127 0.00
1128 0.00
1129 0.00
1130 0.00
1131 0.00
1132 0.00
1133 0.00
1134 0.00
1135 0.00
1136 0.00
1137 0.00
1138 0.00
1139 0.00
1140 0.00
1141 0.00
1142 0.00
1143 0.00
1144 0.00
1145 0.00
1146 0.00
1147 0.00
1148 0.00
1149 0.00
1150 0.00
1151 0.00
1152 0.00
1153 0.00
1154 0.00
1155 0.00
1156 0.00
1157 0.00
1158 0.00
1159 0.00
1160 0.00
1161 0.00
1162 0.00
1163 0.00
1164 0.00
1165 0.00
1166 0.00
1167 0.00
1168 0.00
1169 0.00
1170 0.00
1171 0.00
1172 0.00
1173 0.00
1174 0.00
1175 0.00
1176 0.00
1177 0.00
1178 0.00
1179 0.00
1180 0.00
1181 0.00
1182 0.00
1183 0.00
1184 0.00
1185 0.00
1186 0.00
1187 0.00
1188 0.00
1189 0.00
1190 0.00
1191 0.00
1192 0.00
1193 0.00
1194 0.00
1195 0.00
1196 0.00
1197 0.00
1198 26.16
1199 26.16
1200 26.16
1201 26.34
这里的0,我想要25.32的值。关键是,最初我的数据从0开始。
我们如何在Python中执行此操作?我可以在R中执行此操作。以下是我使用的命令,
library(zoo)
is.na(DF$a) <- DF$a == 0
DF$a <- na.locf(DF$a,na.rm=FALSE)
任何帮助都将不胜感激。
由于
答案 0 :(得分:1)
听起来你正在寻找ffill方法。
假设您没有NaN(或者也想以与0相同的方式填写NaN):
df = df.replace(0, np.NaN).ffill()
如果你确实有NaN,并希望按原样保留NaN:
df.loc[~df.x.isnull(), 'x'] = df.loc[~df.x.isnull(), 'x'].replace(0, np.NaN).ffill()
答案 1 :(得分:0)
如果您愿意使用numpy,这应该可行:
首先,使用glcurve
函数确定符合条件的索引。 (假设您已将数据放入数组中,在本例中称为where
)
x
在前一行中使用indices = np.where(x == 0.0)[0]
是必要的,因为在没有可选替换值的情况下调用[0]
会返回一个元素的元组:满足条件的索引数组(请参阅{ {3}}了解更多信息)。
用以前的非零替换零:
where
这将自动保留前导零,并且仅在存在非零值后才更正间隙。
答案 2 :(得分:0)
版本1:您只想用第一行替换0.00值:
a = range(1, 10)
a = a + [0,0,0,0,0]
# a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 0, 0, 0]
out = [a[0]] + [x if x !=0 else y for x,y in zip(a[1:], a[:-1])]
# out = [1, 2, 3, 4, 5, 6, 7, 8, 9, 9, 0, 0, 0, 0]
所以现在我们有一个包含两个9值的列表。第一个零已被替换。
注意:我假设您无法替换第一行中的0值。
版本2:您希望替换所有0.0值,即使前一行已被替换。
a = range(1, 10)
a = a + [0,0,0,0,0]
# a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 0, 0, 0]
out = [a[0]]
for x in a[1:]:
if x != 0:
out.append(x)
else:
out.append(out[-1])
# out = [1, 2, 3, 4, 5, 6, 7, 8, 9, 9, 9, 9, 9, 9, 9]
现在所有0值都取最后一个非零值。
第3版:根据运营商的反馈意见:
import itertools
a = [0,0,1,2,5,4,0,0,8,9,0,5,0,6]
# accept all leading zeros
out = [x for x in itertools.takewhile(lambda x: x == 0, a[1:])]
for x in a[len(out):]:
if x != 0:
out.append(x)
else:
out.append(out[-1]))
实际上,我的意见中的最佳解决方案,特别是如果您熟悉R,则使用Python Pandas package。请参阅&#34;向前或向后填补空白&#34;部分。该解决方案比尝试使用本机包更加优雅。